#ifndef GROUND_ZONE
#define GROUND_ZONE

#include <vector>
#include <cmath>

#ifdef WIN32
#include <windows.h>
#endif
#include "GL/gl.h"
#include "Case.h"

#include "MemoryManager/debugNew.h"


namespace ground{
	/**
	 * La classe permettant de représenter un zone du terrain composé de case
	 */
	class GroundZone
	{
	private:

		//le ZoneManager peut tout faire ici
		friend class ZoneManager;

		/**
		 * L'identifiant unique de la zone
		 */
		int id;

		/**
		 * La liste des case de la zone
		 */
		std::vector<Case*> cases;

	protected:

		/**
		 * La valeur minimum, concernant la zone, des cases la composant
		 */
		float minValue;

		/**
		 * La valeur maximum concernant la zone des cases la composant
		 */
		float maxValue;

		/**
		 * La valeur moyenne concernant la zone des cases la composant
		 */
		float medValue;

		/**
		 * Le centre du cercle de collision de la zone
		 */
		Point2D colCircleCenter;
		/**
		 * Le rayon du cercle de collision de la zone. C'est en faite le rayon au carré(pour évité calcul de racine
		 * carré plus tard).
		 */
		float colCircleRadius;

		/**
		 * La coordonnée x inférieur de la AA-bounding box 2D de la zone
		 */
		float colAABBminX;
		/**
		 * La coordonnée x supérieur de la AA-bounding box 2D de la zone
		 */
		float colAABBmaxX;
		/**
		 * La coordonnée y inférieur de la AA-bounding box 2D de la zone
		 */
		float colAABBminY;
		/**
		 * La coordonnée y supérieur de la AA-bounding box 2D de la zone
		 */
		float colAABBmaxY;

		/**
		 * Calcul la zone de collision en fonction des cases de la zone
		 */
		void computeCollisionArea();

	public:

		/**
		 * Constructeur
		 */
		GroundZone();

		/**
		 * Destructeur
		 */
		~GroundZone();

		/**
		 * Permet de connaitre l'identifiant de la zone
		 *
		 * @return l'identifiant unique
		 */
		int getID();

		/**
		 * Permet de récupérer les cases composant la zone en 4-connexité.
		 *
		 * @return le vector de cases.
		 */
		const std::vector<Case*>* getCases();

		/**
		 * Permet d'obtenir La valeur minimum, concernant la zone, des cases la composant
		 *
		 * @return la valeur minimum
		 */
		float getMaxCaseValue();

		/**
		 * Permet d'obtenir La valeur maximum, concernant la zone, des cases la composant
		 *
		 * @return la valeur maximum
		 */
		float getMinCaseValue();

		/**
		 * Permet d'obtenir La valeur moyenne, concernant la zone, des cases la composant
		 *
		 * @return la valeur moyenne
		 */
		float getMedCaseValue();

		/**
		 * Permet d'afficher à l'écran la zone pour debugguer
		 */
		void renderDebug();
	};

};// namespace ground

#include "MemoryManager/debugNewOff.h"

#endif
