/*
* SpecialAction.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/

#include "StdInc.h"
#include "SpecialAction.h"
#include "../../AIGateway.h"
#include "../../Goals/CGoal.h"
#include "../../Goals/Invalid.h"

namespace NKAI
{

Goals::TSubgoal SpecialAction::decompose(const CGHeroInstance * hero) const
{
	return Goals::sptr(Goals::Invalid());
}

void SpecialAction::execute(const CGHeroInstance * hero) const
{
	throw cannotFulfillGoalException("Can not execute " + toString());
}

bool CompositeAction::canAct(const AIPathNode * source) const
{
	for(auto part : parts)
	{
		if(!part->canAct(source)) return false;
	}

	return true;
}

Goals::TSubgoal CompositeAction::decompose(const CGHeroInstance * hero) const
{
	for(auto part : parts)
	{
		auto goal = part->decompose(hero);

		if(!goal->invalid()) return goal;
	}

	return SpecialAction::decompose(hero);
}

void CompositeAction::execute(const CGHeroInstance * hero) const
{
	for(auto part : parts)
	{
		part->execute(hero);
	}
}

void CompositeAction::applyOnDestination(
	const CGHeroInstance * hero,
	CDestinationNodeInfo & destination,
	const PathNodeInfo & source,
	AIPathNode * dstNode,
	const AIPathNode * srcNode) const
{
	for(auto part : parts)
	{
		part->applyOnDestination(hero, destination, source, dstNode, srcNode);
	}
}

std::string CompositeAction::toString() const
{
	std::string result = "";

	for(auto part : parts)
	{
		result += ", " + part->toString();
	}

	return result;
}

const CGObjectInstance * CompositeAction::targetObject() const
{
	if(parts.empty())
		return nullptr;

	return parts.front()->targetObject();
}

}