#ifndef GRAPHNODE_H
#define GRAPHNODE_H

#include <vector>
#include "GraphArc.h"

#include "MemoryManager/debugNew.h"


namespace ground{

	// foarward declaration
	class GraphArc;

	/**
	 * classe de base d'un noeud dans un graph.
	 *
	 * tout graph devra redefinire cette classe afin d'en specifier le comportement.
	 * Cette classe sert à specifier l'ensembles des comportement commun a tout les graph pour la recherche de chemin.
	 */
	class GraphNode
	{
	protected:
		/**
		 * variable permettant au pathFinder de savoir si le noeud a été entierement traité ou pas.
		 */
		bool finished;
		/**
		 * cout pour atteindre la case sans heuristique
		 */
		float costWithoutHeuristic;
		/**
		 * cout pour atteindre la case avec l'heuristique comprise dans le cout.
		 */
		float costWithHeuristic;
		/**
		 * le noeud parrent dans le chemin parcourut pas le pathfinding.
		 */
		GraphNode * parent;
	public:
		virtual ~GraphNode(void){};
		/**
		 * methode permettant de recuperer les arc vers les voisin du noeud.
		 * @return std::vector<GraphArc*> : vecteur contenant des pointeurs vers les arc pointant
		 * vers les voisin du noeud.
		 */
		virtual std::vector<GraphArc*>& getNeighbours() = 0; 

		/**
		 * methode permettant de calculer l'heuristiqu sur ce noeud.
		 * @param previous : le noeud precedent dans l'analyse
		 * @param begin : le noeud de depart du chemin.
		 * @param end : le noeud de fin du chemin.
		 * @return float : l'heuristique du noeud.
		 */
		virtual float heuristic(GraphNode* previous, GraphNode* begin, GraphNode* end) = 0;

		/**
		 * methode permettant de savoir si le noeud a été entierement traité par le pathFinder
		 * @return bool : true si le noeud a été entierement traite, false sinon.
		 */
		inline bool isFinished()const{return finished;};

		/**
		 * methode permettant de definir si lenoeud a été entierement traité ou pas.
		 * @param f : true si le noeud a été entierement traité, false sinon.
		 */
		inline void setFinished(bool f){finished = f;};

		/**
		 * methode permettant de definir le cout du noeud sans prise en compte de l'heuristique
		 * @param cost : le cout du noeud
		 */
		inline void setCostWithoutHeuristic(float cost){costWithoutHeuristic = cost;};

		/**
		 * methode permettant de recuperer le cout du noeud sans prise en compte de l'heuristique
		 * @return float : le cout de la case sans prise en compte de l'heuristique. -1 si le noeud n'est pas initialisé
		 */
		inline float getCostWithoutHeuristic()const{return costWithoutHeuristic;};

		/**
		 * methode permettant de definir le cout du noeud avec prise en compte de l'heuristique
		 * @param : le cout du noeud
		 */
		inline void setCostWithHeuristic(float cost){costWithHeuristic = cost;};

		/**
		 * methode permettant de recuperer le cout du noeud avec prise en compte de l'heuristique
		 * @return le cout du noeud avec prise en compte de l'heuristique. -1 si le noeud n'est pas initialisé
		 */
		inline float getCostWithHeuristic()const{return costWithHeuristic;};

		/**
		 * methode permettant de definir le noeud parent du noeud courant.
		 * @param parent : le noeud parent du noeud courant dans l'analyse du pathfinder.
		 */ 
		inline void setParent(GraphNode * parent){this->parent = parent;};

		/**
		 * methode permettant de recuperer le noeud parent dans l'analyse du pathfinder
		 * @return GraphNode * le parent du noeud.
		 */
		inline GraphNode * getParent(){return parent;};

		/**
		 * methode permettant de savoir si le noeud a été initialisé par le pathfinder.
		 * @return bool : true si le noeud est initialise, false sinon.
		 */
		inline bool isInitialised()const{return costWithHeuristic == -1.0f;};
	};

};// namespace ground

#include "MemoryManager/debugNewOff.h"

#endif
