#include "ReplayUnit.h"



ReplayUnit::ReplayUnit(const sc2::Unit * unit, IDAReplayObserver & replayObserver)
	: m_replayObserver(&replayObserver), Unit(unit)
{
	
}

 std::string ReplayUnit::getType() const
{
	 return m_unit->unit_type.to_string();
		
}

 std::string ReplayUnit::getTypeName() const
 {
	 return sc2::UnitTypeToName(m_unit->unit_type);
 }

bool ReplayUnit::hasTarget() const
{
	BOT_ASSERT(isValid(), "Unit is not valid");
	if (getUnitPtr()->orders.size() > 0) {
		if (getUnitPtr()->orders[0].target_unit_tag != NULL) {
			CCUnitID t_id = getUnitPtr()->orders[0].target_unit_tag;
			// IDAReplayObserver checks if the unit with this tag still exists
			if (m_replayObserver->UnitExists(t_id)){
				// IDAReplayObserver finds the unit with this tag, and returns true if valid
				return m_replayObserver->GetUnit(t_id).isValid();
			}
		}
	}

	return false;
}

ReplayUnit ReplayUnit::getTarget() const
{
	BOT_ASSERT(isValid(), "Unit is not valid");


	// if unit has order, check tag of target of first order
	if (getUnitPtr()->orders.size() > 0) {
		// t_id is set to the unit tag of the target
		CCUnitID t_id = getUnitPtr()->orders[0].target_unit_tag;
		// Checks if the tag is a null tag or the unit have been removed
		if (t_id != sc2::NullTag && m_replayObserver->UnitExists(t_id)){
			// IDAReplayObserver finds the unit with this tag
			return m_replayObserver->GetUnit(t_id);
		}
	}
	ReplayUnit this_unit = ReplayUnit(m_unit, *m_replayObserver);
	return this_unit;
}

int ReplayUnit::getPlayer() const
{
	return m_unit->owner;
}