#ifndef COLLISIONMANAGER_H
#define COLLISIONMANAGER_H

#include <map>

#include "CollisionInfo.h"

#include "MemoryManager/debugNew.h"

/**
 * classe gerant les collision entre les unitée.
 * 
 * Cette classe gere les collision entre les unitée et les remet a une place valide lors d'une collision entre 2 unitée.
 * Elle utilise le pattern <B>SINGLETON</B>
 */
class CollisionManager
{
private:
	/**
	 * la map qui contient toutes les unitée dont on veut gerer les collisions.
	 */
	std::map<void*,CollisionInfo*> collidables;

	/**
	 * l'instance unique de CollisionManager pour le pattern <B>SINGLETON</B>
	 */ 
	static CollisionManager * instance;

	/**
	 * constructeur par defaut : mis an privé pour le pattern <B>SINGLETON</B>
	 */
	CollisionManager(void);

	/**
	 * destructeur par defaut : mis an privé pour le pattern <B>SINGLETON</B>
	 */
	virtual ~CollisionManager(void);
	/**
	 * methode permettant de gerer une collision entre 2 entités. La premiere est plus prioritaire sur
	 * le seconde
	 * @param first : l'entité la plus prioritaire des 2
	 * @param second : l'entité la moins prioritaire des 2
	 * @param moving : definit si la seconde entité est en mouvement (la premiere l'est forcement)
	 * @param interPenetration : le taux de collision.
	 */
	void collide(CollisionInfo* first, CollisionInfo * second,bool moving, float interPenetration);
public:
	/**
	 * methode permettant de recuperer l'instance unique de CollisionManager du pattern <B>SINGLETON</B>
	 * @return CollisionManager : l'instance unique de CollisionManager.
	 */
	static CollisionManager& getInstance();

	/**
	 * methode utilisée pour detruire l'instance unique de CollisionManager.
	 *
	 * Doit imperativement etre appelé à la fin du programme.
	 */
	static void destroy();

	/**
	 * methode utilisée pour ajouter une enité au manager de collisions.
	 * @param info : l'entitée à ajouter au manager de collisions.
	 */
	void addCollidable(CollisionInfo * info);

	/**
	 * methode utiliser pour supprimer une entité du manager de collisions.
	 * @param info : l'entité à supprimer du manager de collisions.
	 */
	void removeCollidable(CollisionInfo * info);

	/**
	 * methode permettant de savoir si une entité est presente dans le manager de collisions
	 * @param info : l'entité dont on veut tester l'existance dans le manager.
	 * @return bool : true si le manager contient l'entité, false sinon.
	 */
	bool containCollidable(CollisionInfo * info);

	/**
	 * methode permettant de supprimer toutes les entitée du manager.
	 */
	void removeAll();

	/**
	 * methode servant à gerer les collision.
	 *
	 * Cette methode doit etre appelée a chaque tour de gestion des unitées.
	 */
	void processCollisions();
};

#include "MemoryManager/debugNewOff.h"

#endif
