/*
* Copyright 2006 Sony Computer Entertainment Inc.
*
* Licensed under the MIT Open Source License, for details please see license.txt or the website
* http://www.opensource.org/licenses/mit-license.php
*
*/ 

#ifndef __DAE__
#define __DAE__

// We use the boost filesystem library for cross-platform file system support. You'll need
// to have boost on your machine for this to work. For the Windows build boost is provided
// in the external-libs folder, but for Linux it's expected that you'll install a boost
// obtained via your distro's package manager. For example on Debian/Ubuntu, you can run
//   apt-get install libboost-filesystem-dev
// to install the boost filesystem library on your machine.
//
// Disable the warnings we get from Boost
// warning C4180: qualifier applied to function type has no meaning; ignored
// warning C4245: 'argument' : conversion from 'int' to 'boost::filesystem::system_error_type', 
//   signed/unsigned mismatch
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4180 4245)
#endif
#ifndef NO_BOOST
#include <boost/filesystem/convenience.hpp>
#endif
#ifdef _MSC_VER
#pragma warning(pop)
#endif

#include <dae/daeTypes.h>
#include <dae/daeError.h>
#include <dae/daeDatabase.h>
#include <dae/daeIOPlugin.h>
#include <dae/daeAtomicType.h>
#include <dae/daeMetaElement.h>
#include <dae/daeIDRef.h>
#include <dae/daeURI.h>
#include <dae/daeUtils.h>
#include <dae/daeRawResolver.h>
#include <dae/daeSIDResolver.h>

class domCOLLADA;
typedef daeSmartRef<domCOLLADA> domCOLLADARef;
class daeDatabase;

// The DAE class is the core interface via which you interact with the DOM. It
// has methods to load/save documents, get the root element of each document,
// etc. Although internally the DOM works exclusively with URIs, the methods of
// the DAE class that take document paths can take URIs or OS-specific file
// paths.
class DLLSPEC DAE
{
public:
	// Constructor. If no database or IO plugin are provided, a default database and
	// IO plugin will be used.
	DAE(daeDatabase* database = NULL, daeIOPlugin* ioPlugin = NULL)
	  : atomicTypes(*this),
	    baseUri(*this, cdom::getCurrentDirAsUri().c_str())
	{
		// See the end of the thread linked below for an explanation of why we have the DAE
		// constructor set up this way. Basically, I'm going to be changing the build output 
		// location, and when this happens people sometimes continue to link against the old
		// libraries by accident (e.g. if they just do an svn update). By introducing a new
		// function that gets called from a function in a header file, I'm ensuring that someone
		// who tries linking against old libraries will get a link error. This may not sound
		// very nice, but it's certainly better than getting bizarre runtime crashes.
		// https://collada.org/public_forum/viewtopic.php?t=771&sid=f13c34f2d17ca720c5021bccbe5128b7
		init(database, ioPlugin);
		dummyFunction1();
	}

	virtual ~DAE();

	// Release all memory used by the DOM. You never need to call this explicitly. It's
	// called automatically when all DAE objects go out of scope.
    // Deletes directory returned by cdom::getSafeTmpDir().
	static void cleanup();
	
public:
	// Database setup	
	virtual daeDatabase* getDatabase();
	virtual daeInt setDatabase(daeDatabase* database);

	// IO Plugin setup
	virtual daeIOPlugin* getIOPlugin();
	virtual daeInt setIOPlugin(daeIOPlugin* plugin);

	// Creates a new document, returning null on failure.
	virtual domCOLLADA* add(const std::string& path);
	// Opens an existing document, returning null on failure.
	virtual domCOLLADA* open(const std::string& path);
	// Opens a document from memory, returning null on failure.
	virtual domCOLLADA* openFromMemory(const std::string& path, daeString buffer);
	// Write a document to the path specified by the document's URI, returning false on failure.
	virtual bool write(const std::string& path);
	// Write a document to the path specified in the second parameter, returning false on failure.
	virtual bool writeTo(const std::string& docPath, const std::string& pathToWriteTo);
	// Writes all documents, returning false if any document failed to write.
	virtual bool writeAll();
	// Close a specific document, unloading all memory used by the document. Returns false on failure.
	virtual void close(const std::string& path);
	// Remove all loaded documents. Always returns DAE_OK.
	virtual daeInt clear();

	// Returns the total number of documents.
	virtual int getDocCount();
	// Returns the i'th document .
	virtual daeDocument* getDoc(int i);
	// Returns a document matching the path.
	virtual daeDocument* getDoc(const std::string& path);
	
	// Get the root domCOLLADA object corresponding to a particular document.
	virtual domCOLLADA* getRoot(const std::string& path);
	// Set the root domCOLLADA object corresponding to a particular document, returning false on failure.
	virtual bool        setRoot(const std::string& path, domCOLLADA* root);

	// Returns the Collada version, i.e. 1.4, 1.5, etc. Note that this _isn't_ the
	// same as the DOM version (1.3, 2.0, ...).
	virtual daeString getDomVersion();

	// Returns the (modifiable) list of atomic type objects.
	daeAtomicTypeList& getAtomicTypes();

	// Get/set a daeMetaElement object given the meta object's type ID.
	daeMetaElement* getMeta(daeInt typeID);
	void setMeta(daeInt typeID, daeMetaElement& meta);

	// Get all daeMetaElement objects.
	daeMetaElementRefArray& getAllMetas();

	// Returns the list of URI resolvers. You can modify the list to add new resolvers.
	daeURIResolverList& getURIResolvers();

	// The base URI used for resolving relative URI references.
	daeURI& getBaseURI();
	void setBaseURI(const daeURI& uri);
	void setBaseURI(const std::string& uri);

	// Returns the list of ID reference resolvers. You can modify the list to add new
	// resolvers.
	daeIDRefResolverList& getIDRefResolvers();

	// Meant for internal DOM use only.
	daeRawRefCache& getRawRefCache();
	daeSidRefCache& getSidRefCache();

	// These functions specify the client's character encoding for the DOM. The
	// default is Utf8, but if you specify Latin1 then the DOM will use libxml's
	// character conversion functions to convert to Utf8 when writing data and
	// convert to Latin1 when reading data. This can help with the handling of
	// non-ASCII characters on Windows. Only when using libxml for xml I/O does
	// any character conversion occur.
	//
	// Most people can probably just ignore this completely. If you have trouble
	// with non-ASCII characters on Windows, try setting the char encoding to
	// Latin1 to see if that helps.
	//
	// Frankly this certainly isn't the best way of handling non-ASCII character
	// support on Windows, so this interface is a likely target for significant
	// changes in the future.
	//
	// See this Sourceforge thread for more info:
	// http://sourceforge.net/tracker/index.php?func=detail&aid=1818473&group_id=157838&atid=805426
	//
	enum charEncoding {
		Utf8,
		Latin1
	};

	// Global encoding setting. Defaults to Utf8. Set this if you want to make a
	// char encoding change and apply it to all DAE objects.
	static charEncoding getGlobalCharEncoding();
	static void setGlobalCharEncoding(charEncoding encoding);

	// Local encoding setting. If set, overrides the global setting. Useful for setting
	// a specific char encoding for a single DAE object but not for all DAE objects.
	charEncoding getCharEncoding();
	void setCharEncoding(charEncoding encoding);

	// Deprecated. Alternative methods are given.
	virtual daeInt load(daeString uri, daeString docBuffer = NULL); // Use open
	virtual daeInt save(daeString uri, daeBool replace=true); // Use write
	virtual daeInt save(daeUInt documentIndex, daeBool replace=true); // Use write
	virtual daeInt saveAs(daeString uriToSaveTo, daeString docUri, daeBool replace=true); // Use writeTo
	virtual daeInt saveAs(daeString uriToSaveTo, daeUInt documentIndex=0, daeBool replace=true); // Use writeTo
	virtual daeInt unload(daeString uri); // Use close
	virtual domCOLLADA* getDom(daeString uri); // use getRoot
	virtual daeInt      setDom(daeString uri, domCOLLADA* dom); // use setRoot

private:
	void init(daeDatabase* database, daeIOPlugin* ioPlugin);
	void dummyFunction1();
	std::string makeFullUri(const std::string& path);
	domCOLLADA* openCommon(const std::string& path, daeString buffer);
	bool writeCommon(const std::string& docPath, const std::string& pathToWriteTo, bool replace);

	daeDatabase *database;
	daeIOPlugin *plugin;
	bool defaultDatabase;
	bool defaultPlugin;
	daeAtomicTypeList atomicTypes;
	daeMetaElementRefArray metas;
	daeURI baseUri;
	daeURIResolverList uriResolvers;
	daeIDRefResolverList idRefResolvers;
	daeRawRefCache rawRefCache;
	daeSidRefCache sidRefCache;

	std::auto_ptr<charEncoding> localCharEncoding;
	static charEncoding globalCharEncoding;
};


template <typename T> 
inline T *daeSafeCast(daeElement *element)
{ 
	if (element  &&  element->typeID() == T::ID())
		return (T*)element; 
	return NULL; 
}


#endif // __DAE_INTERFACE__
