#pragma once

#include "Common.h"
#include "StrategyData.h"
#include "InformationManager.h"

namespace MyBot
{
	class Squad
	{
	public:
		Squad();
		~Squad();

		std::string			squadName;

		BWAPI::Unitset		unitset;			///< 부대 소속 유닛들

		Mission				commonMission;		///< 부대 공통의 목표

		//int					state;				///< 부대 상태 (드랍 탑재, 이동, 드랍 강하, 드랍 공격.   이동중. 도착해서 임무수행중)

		/// 아군 Unit 과 Mission 간 매핑 관계		
		std::map<BWAPI::Unit, Mission> unitMissionMap;

		/// 아군 Unit 과 적군 Unit 간 매핑 관계		
		/// 아군 Unit 1 마리는 최대 적군 Unit 1 마리에만 매핑된다
		/// 적군 Unit 1 마리에 아군 Unit 여러 마리가 매핑될 수 있다
		std::map<BWAPI::Unit, BWAPI::Unit> unitTargetMap;

		/// 헬퍼함수 - unit 에게 mission 을 부여
		void setUnitMission(BWAPI::Unit unit, Mission newMission);

		Mission* getUnitMission(BWAPI::Unit unit);

		void addUnit(BWAPI::Unit unit);

		void addUnitWithMission(BWAPI::Unit unit, Mission newMission);

		BWAPI::Unitset::iterator Squad::removeUnit(BWAPI::Unitset::iterator  it);

		void executeMission();

		int getCount(BWAPI::UnitType unitType);

		const bool operator == (const Squad & rhs) const
		{
			return (squadName.compare(rhs.squadName) == 0);
		}

		bool controlZergling(BWAPI::Unit myUnit);
		bool controlHydralisk(BWAPI::Unit myUnit);
		bool controlLurker(BWAPI::Unit myUnit);
		bool controlDefiler(BWAPI::Unit myUnit);
		bool controlQueen(BWAPI::Unit myUnit);
		bool controlScourge(BWAPI::Unit myUnit);
		bool controlMutalisk(BWAPI::Unit myUnit);
		bool controlGuardian(BWAPI::Unit myUnit);
		bool controlUltralisk(BWAPI::Unit myUnit);
		bool controlDevourer(BWAPI::Unit myUnit);
	};
}

