#include "ActionMount.h"
#include "ActionMove.h"
#include "GroundMap.h"

#include "MemoryManager/debugNew.h"

using namespace RenderSystem;

ActionMount::ActionMount(Unit * u,unitEnumeration::UnitState state, Mount * m) : UnitAction(u,state){
	unit = u;
	mount = m;
	ground::GroundMap::getInstance().setCurrentUnit(unit);
	ground::GroundMap::getInstance().computePath(unit->getPosition(),mount->getPosition());
	ground::GroundMap::getInstance().setCurrentUnit(NULL);
	if (ground::GroundMap::getInstance().haveFoundPath()){
		// on a trouvé un chemin
		path = ground::GroundMap::getInstance().getLastPath();
	}else{
		// on a pas trouvé de chemin mais on a quand même un chemin qui nous approche de notre but
		path = ground::GroundMap::getInstance().getLastPath();
	}
}

ActionMount::~ActionMount(void)
{
}

void ActionMount::execute()
{
	/**
	 * on restaure l'etat de l'unité
	 */
	unit->setState(this->unitState);
	unit->allowDust(false);
	float dist = (unit->getPosition() - mount->getPosition()).getLength();

	if(dist > (unit->getCollisionRadius()+mount->getCollisionRadius() + 0.1) && mount->isFree()) {
		if (path.empty()){
			ground::GroundMap::getInstance().setCurrentUnit(unit);
			ground::GroundMap::getInstance().computePath(unit->getPosition(),mount->getPosition());
			ground::GroundMap::getInstance().setCurrentUnit(NULL);
			if (ground::GroundMap::getInstance().haveFoundPath()){
				// on a trouvé un chemin
				path = ground::GroundMap::getInstance().getLastPath();
			}else{
				// on a pas trouvé de chemin mais on a quand même un chemin qui nous approche de notre but
				path = ground::GroundMap::getInstance().getLastPath();
			}
		}
		std::vector<Point2D>::iterator it = path.begin();
		if(!path.empty()) {
			// il faut se rapprocher de la monture
			unit->pushAction(this);
			if (path.size() <= 1){
				// on est pres du cheval : on va directement sur le cheval
				unit->pushAction(new ActionMove(unit,this->unitState, mount->getPosition()));
			}else{
				// il rest plusieurs cases à parcourir, on empile un action move normal
				unit->pushAction(new ActionMove(unit,this->unitState, *it));
			}
			path.erase(it);
		} else {
			// on n'arrive pas à atteindre la monture
			dispose();
		}
	} else if(mount->isFree()) {
		// la monture est à portée, alors on y monte
		unit->mountOn(mount);
		dispose();
	} else{
		//  la monture n'est plus disponible
		dispose();
	}
}
