#ifndef DECORMANAGER_H
#define DECORMANAGER_H

#include <string>
#include <map>
#include <vector>
#include "Model.h"
#include "Decor.h"
#include "RegistredTexture.h"

#include "MemoryManager/debugNew.h"

namespace RenderSystem{
	/**
	 * classe gerant les decors affiché sur la carte.
	 */
	class DecorManager
	{
	private:
		/**
		 * la map qui contient les models des decors
		 */
		std::map<std::string,Model*> modelsMap;
		/**
		 * vecteur stockant les decors de la carte.
		 */
		std::vector<Decor*> decors;
		/**
		 * la map contenant les textures des decors.
		 */
		std::map<std::string,RegistredTexture*> texturesMap;
		/**
		 * l'instance unique pour le pattern Singleton
		 */
		static DecorManager* instance;
		/**
		 * constructeur par defaut.
		 */
		DecorManager(void);
		/**
		 * destructeur par defaut
		 */
		virtual ~DecorManager(void);

		/**
		 * methode permettant de recuperer un model de la map.
		 * Si le model n'existe pas dans la map, on le charge
		 * @param name : le nom du fichier du model
		 * @param dynamic : definit si on doit cherger un model dynamic ou pas lorsque le model n'est pas dans
		 * la map
		 * @return Model* : le model de la map. NULL si on ne peut pas cherger le model.
		 */
		Model* getModel(std::string name,bool dynamic);

		/**
		 * methode permettant de recuperer une texture dans la map de textures
		 * @return RegistredTexture*: la texture à charger. NULL si on ne peut pas la charger.
		 */
		RegistredTexture* getTexture(std::string name);

		/** 
		 * methode permettant de parser une ligne du fichier de description des decors
		 * @param line : la ligne à parser
		 */
		void parseLine(std::string line);

		/**
		 * methode servant à parser une ligne decrivant un decor
		 * @param buffer : la ligne à parser
		 */
		void parseDecor(char * buffer);

		/**
		 * methode servant à parser une ligne decrivant un feu
		 * @param buffer : la ligne parser.
		 */ 
		void parseFire(char* buffer);
		/**
		 * methode servant à parser une ligne decrivant un feu
		 * @param buffer : la ligne parser.
		 */ 
		void parseSpring(char* buffer);
	public:
		static DecorManager& getInstance();
		static void destroy();

		/**
		 * methode permettant de decharger de la memoire les decors
		 */
		void unload();

		/**
		 * methode permettant de charger un fichier de descripteurs de decors
		 * @param path : le chemin du descripteur de decors
		 * @return bool : true si le chargement s'est bien passe, false sinon.
		 */
		bool load(std::string path);
	};

};// namespace

#include "MemoryManager/debugNewOff.h"

#endif
