#ifndef ENNEMYUNIT_H
#define ENNEMYUNIT_H

#include "Unit.h"
#include "Mount.h"
#include "DangerGenerator.h"
#include "UnitEnumeration.h"

#include "MemoryManager/debugNew.h"
/*
* file EnnemyUnit.h
* EnnemyUnit
* 
* 27/01/2006
* Copyright Piquier Production
* 
*/

// forward declaration
class Unit;


/**
* Classe EnnemyUnit, hérite de Entity, encapsule Unit et la spécialise 
* en y ajoutant les traitement pour l'ennemi (vision, ect.).
*
*/

class EnnemyUnit : public ground::DangerGenerator
/**
* TODO: s'assurer que lorsque l'on veut accéder à unit et que unit n'existe plus, ça ne casse pas tout..
*/

{
public:
	enum EnnemyState {
		VISIBLE,
		DEAD,
		HIDDEN
	};

private:

	/**
	* l'unité encapsulée
	*/
	Unit * unit;

	/**
	* état dans lequel est cet ennemi (visible, perdu de vue..)
	*/
	EnnemyState state;

	/**
	* Position sur la carte où a été vu cet ennemi pour la dernière fois
	*/
	Point2D lastPosition;

	/**
	* Dernière date à laquelle on a vue l'unité
	* (date en nombre de top d'IA)
	*/
	int lastDate;

	/**
	 * Distance used for sorting in OrderAttack
	 */
	float distance;

public :

	/**
	* Nombre d'update de l'IA pendant lesquelles on conserve une trace de l'unité ennemie
	*/
	int hiddenElapsedTime;

public:

	/**
	* constructeur de la classe EnnemyUnit
	*/
	EnnemyUnit(Unit * u, EnnemyState s);

	/**
	* destructeur de la classe EnnemyUnit
	*/
	~EnnemyUnit(void);

	/**
	* DEPRECATED: a n'utiliser que lorsqu'on veut effectivement un objet de type Unit
	*/
	Unit * getUnit();

	/**
	* Permet de signaler à l'unité quelle est attaquée
	* 
	* @param Point2D : position de l'unité qui nous attaque
	*/
	void notifyAttack(Point2D position);

	/**
	* diminue les points de vie de l'unité.
	*/
	void decreaseHealthPoint(int decreasePoint) ;

	/**
	* diminue les points de vie de la monture de l'unité.
	* sans effets si l'unité est non montée.
	*/
	void decreaseMountHealthPoint(int decreasePoint) ;

	/**
	* Position de l'unité encaspulée
	*/
	Point2D getPosition();

	/**
	* Retourne l'altitude de l'unité ennemie 
	* (appel au terrain)
	*/
	float getAltitude();

	/**
	 * methode permettant de recuperer le rayon de l'unité
	 * @return float : le rayon
	 */
	float getRadius();

	/**
	 * methode permettant de recuperer l etat l'unité
	 * @return  : l etat
	 */
	enum EnnemyState getState();

	/**
	* Retourne le type d'armure de l'unité
	*
	* @return Armor : le type de l'armure 
	* @see Unit::Armor
	*/
	unitEnumeration::Armor getArmorType();

	/**
	* accesseur en lecture à healthPoint
	*/
	int getHealthPoint();

	/**
	* Permet de récupérer la monture de l'ennemi.
	*/
	Mount * getMount();

	/**
	 * returns type of the unit (archer...)
	 */
	unitEnumeration::UnitType getType();
	
	/**
	* 
	*/
	void setState(EnnemyState s);

	/**
	* 
	*/
	void kill();

	/**
	* Permet de savoir si l'unité est vivante ou morte
	*/
	bool isAlive();

	/**
	* Permet d'obtenir le statut de l'unite ennemie : monté ou non
	*/
	bool isMounted();

	/**
	* Permet d'obtenir le statut de l'unite ennemie : en déplacement
	*/
	bool isMoving();


	/**
	* Permet d'obtenir le statut de l'unite ennemie : en charge
	*/
	bool isCharging();

	/**
	* Permet d'obtenir le statut de l'unite ennemie : en fuite
	*/
	bool isFleeing();

	/**
	* Permet d'obtenir le statut de l'unite ennemie : en position de combat
	*/
	bool isInCombatPosture();
	
	/**
	* Permet d'obtenir le statut de l'unite ennemie : en attente
	*/
	bool isWaiting();

	/**
	* Permet de faire descendre l'unité de sa monture quand celle ci meurt
	*/
	void mountDie();

	Point2D getDangerPosition();
	float getDangerRadius();
	float getDangerLevel();

	bool isVisible();

	void updateDistance(Point2D &pt);
	float getDistance();

};

#include "MemoryManager/debugNewOff.h"


#endif
