#ifndef LOADER_H_
#define LOADER_H_
#include <pugixml.hpp>
#include <flecs.h>
#include <OgreColourValue.h>
#include <OgreQuaternion.h>
#include <OgreResourceGroupManager.h>
#include <OgreString.h>
#include <OgrePlugin.h>
#include <OgreCodec.h>

class SceneLoader {
public:
	SceneLoader();
	virtual ~SceneLoader();

	void load(Ogre::DataStreamPtr &stream, const Ogre::String &groupName,
		  Ogre::SceneNode *rootNode, flecs::entity e);

	void exportScene(Ogre::SceneNode *rootNode,
			 const Ogre::String &outFileName);

	const Ogre::ColourValue &getBackgroundColour()
	{
		return mBackgroundColour;
	}
	static void setupPhysicsBody(Ogre::SceneNode *node,
				     Ogre::MovableObject *entity,
				     flecs::entity base_e);

protected:
	void writeNode(pugi::xml_node &parentXML, const Ogre::SceneNode *node);
	void processScene(pugi::xml_node &XMLRoot);

	void processNodes(pugi::xml_node &XMLNode);
	void processExternals(pugi::xml_node &XMLNode);
	void processEnvironment(pugi::xml_node &XMLNode);
	void processTerrainGroup(pugi::xml_node &XMLNode);
	void processBlendmaps(pugi::xml_node &XMLNode);
	void processUserData(pugi::xml_node &XMLNode,
			     Ogre::UserObjectBindings &userData);
	void processLight(pugi::xml_node &XMLNode,
			  Ogre::SceneNode *pParent = 0);
	void processCamera(pugi::xml_node &XMLNode,
			   Ogre::SceneNode *pParent = 0);

	void processNode(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent = 0);
	void processLookTarget(pugi::xml_node &XMLNode,
			       Ogre::SceneNode *pParent);
	void processTrackTarget(pugi::xml_node &XMLNode,
				Ogre::SceneNode *pParent);
	void processEntity(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent);
	void processParticleSystem(pugi::xml_node &XMLNode,
				   Ogre::SceneNode *pParent);
	void processBillboardSet(pugi::xml_node &XMLNode,
				 Ogre::SceneNode *pParent);
	void processPlane(pugi::xml_node &XMLNode, Ogre::SceneNode *pParent);
	void processNodeAnimations(pugi::xml_node &XMLNode,
				   Ogre::SceneNode *pParent);
	void processNodeAnimation(pugi::xml_node &XMLNode,
				  Ogre::SceneNode *pParent);
	void processKeyframe(pugi::xml_node &XMLNode,
			     Ogre::NodeAnimationTrack *pTrack);

	void processFog(pugi::xml_node &XMLNode);
	void processSkyBox(pugi::xml_node &XMLNode);
	void processSkyDome(pugi::xml_node &XMLNode);
	void processSkyPlane(pugi::xml_node &XMLNode);

	void processLightRange(pugi::xml_node &XMLNode, Ogre::Light *pLight);
	void processLightAttenuation(pugi::xml_node &XMLNode,
				     Ogre::Light *pLight);
	void processLightSourceSize(pugi::xml_node &XMLNode,
				    Ogre::Light *pLight);
	Ogre::SceneManager *mSceneMgr;
	Ogre::SceneNode *mAttachNode;
	Ogre::String m_sGroupName;
	Ogre::ColourValue mBackgroundColour;
	Ogre::String mNamePrefix;
	int counter;
	flecs::entity base_e;
};

#endif
