#ifndef GROUPPATHFINDER_H
#define GROUPPATHFINDER_H

#include <map>

#include "Unit.h"

#include "MemoryManager/debugNew.h"

namespace ground{
	/**
	 * classe servant à gerer un groupe d'unitée pour le pathFinding.
	 */
	class GroupPathFinder
	{
	private:
		/**
		 * la map qui contient les unitée du groupe.
		 */
		std::map<void*,Unit*> units;
		/**
		 * la map qui contient les decalages de chaque unité par rapport au centre du groupe.
		 */
		std::map<Unit*,Point2D> offset;
		/**
		 * les unités qui on signalé qu'elle sont arrivé à leur position
		 */
		std::map<void*,Unit*> arrivedUnits;
		/**
		 * la vitesse de l'unité la plus lente en tenant compte du terrain et des detours.
		 */
		float minUnitSpeed;
	public:
		/**
		 * constructeur par defaut
		 */
		GroupPathFinder(void);
		/**
		 * destructeur par defaut
		 */
		virtual ~GroupPathFinder(void);
		/**
		 * methode permettant d'ajouter une unitée au groupe
		 * @param unit : l'unité à ajouter.
		 */ 
		void addUnit(Unit* unit);
		/**
		 * methode permettant de supprimer une unité du groupe
		 * @param unit: l'unité à supprimer du groupe
		 */
		void removeUnit(Unit* unit);
		/**
		 * methode permettant de savoir si une unité appartient au groupe
		 * @param unit : l'unité dont on souhaite tester l'existence
		 * @return bool : true si l'unité existe dans le groupe, false sinon.
		 */
		bool containUnit(Unit* unit);
		/**
		 * methode permettant de supprimer toutes les unité du groupe.
		 */
		void removeAllUnit();
		/**
		 * methode permettant de recuperer la map de unités du groupe.
		 */
		std::map<void*,Unit*>& getUnits();

		/**
		 * methode permettant de recuperer le centre du groupe.
		 */
		Point2D getCenter();

		/**
		 * methode permettant de recuperer le decalage de chaque unité par rapport au centre du groupe
		 * @return std::map<void*,Point2D> : la map qui contient comme clé l'addrese memoire de l'unité, et comme
		 * valeure le decalage de l'unité par rapport au centre du groupe.
		 */
		std::map<Unit*,Point2D>& getOffsetMap();

		/**
		 * methode permettant de recuperer la vitesse de l'unité la plus lente en tenant compte du terrain et des detours effectué
		 * par les unité.
		 * @return float : la vitesse minimum.
		 */
		float getMinUnitSpeed();

		/**
		 * methode permettant de calculer la vitesse de l'unité la plus lente en tenant compte du terrain et des
		 * detours effectué par les unité.
		 * @see getMinUnitSpeed()
		 */
		void computeMinUnitSpeed();

		/**
		 * methode permettant de savoir si les unité ont fini le mouvement ou pas
		 * @return bool : true si toutes les unité on terminé le mouvement, false sinon.
		 */
		bool moveFinished();

		/**
		 * methode à appeler pour signaler qu'une unité est arrivé
		 */
		void signalArriving(Unit* unit);
	};
};//namespace ground

#include "MemoryManager/debugNewOff.h"

#endif
