#include "StrategyManager.h"

using namespace MyBot;

void StrategyManager::figureOutEnemyStrategy()
{

	// 적군의 보유 건물 종류, 보유 건물 위치, 보유 유닛 종류, 현재 frameCount 에 따라 
	// 적군의 빌드 전략 및 전투 전략이 무엇인지 알아낸다
	if (InformationManager::Instance().enemyRace == BWAPI::Races::Protoss)
	{
		// 적 프로토스의 기본 빌드 전략은 하드코어 질럿 러시라고 본다
		if (enemyCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
			setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Hardcore_Zealot);
		}
		// 적 프로토스의 기본 공격 전략은 정면 지상군 러시라고 본다
		if (enemyCurrentCombatStrategy == CombatStrategy::CombatStrategy_Unknown) {
			setEnemyCombatStrategy(CombatStrategy::Protoss_Combat_Front_Ground_Rush);
		}

		if (BWAPI::Broodwar->getFrameCount() < 20 * 60 * 8) {

			if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Gateway) >= 3
				&& enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Zealot) >= 8
				&& enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Dragoon) == 0
				&& enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Cybernetics_Core) == 0)
			{
				setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Hardcore_Zealot);
			}
		}

		if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Dragoon) >= 1
			|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Cybernetics_Core) >= 1) 
		{
			if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Reaver) >= 1 
				|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Robotics_Support_Bay) >= 1) {
				setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Ground_Reaver);
			}
			else if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_High_Templar) >= 1
				|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Dark_Templar) >= 1
				|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Templar_Archives) >= 1) {
				setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Ground_Templar);
			}
			else {
				setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Zealot_Dragoon);
			}

		}

		if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Carrier) >= 2
			|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Protoss_Fleet_Beacon) >= 1) {
			setEnemyBuildStrategy(BuildStrategy::Protoss_Build_Air_Carrier);
		}
	}
	else if (InformationManager::Instance().enemyRace == BWAPI::Races::Terran)
	{
		// 적 테란의 기본 빌드 전략은 바이오닉 테란 이라고 본다
		if (enemyCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
			setEnemyBuildStrategy(BuildStrategy::Terran_Build_Bionic);
		}
		// 적 테란의 기본 공격 전략은 정면 지상군 러시라고 본다
		if (enemyCurrentCombatStrategy == CombatStrategy::CombatStrategy_Unknown) {
			setEnemyCombatStrategy(CombatStrategy::Terran_Combat_Front_Ground_Rush);
		}

		if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Barracks) < enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Factory)
			|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Marine) < enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Vulture)
			|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Medic) < enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Siege_Tank_Siege_Mode) + enemyUnitData->getNumUnits(BWAPI::UnitTypes::Terran_Siege_Tank_Tank_Mode))
		{
			setEnemyBuildStrategy(BuildStrategy::Terran_Build_Mechanic);
		}
		else {
			setEnemyBuildStrategy(BuildStrategy::Terran_Build_Bionic);
		}
	}
	else if (InformationManager::Instance().enemyRace == BWAPI::Races::Zerg)
	{
		// 적 저그의 기본 빌드 전략은 저글링 히드라 라고 본다
		if (enemyCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
			setEnemyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk);
		}
		// 적 저그의 기본 공격 전략은 정면 지상군 러시라고 본다
		if (enemyCurrentCombatStrategy == CombatStrategy::CombatStrategy_Unknown) {
			setEnemyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
		}

		// 게임 시작 후 3분 전에 Zerg_Spawning_Pool 발견 시 패스트 저글링
		if (BWAPI::Broodwar->getFrameCount() < 20 * 60 * 3) {

			if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Spawning_Pool) >= 1
				|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Zergling) >= 4)
			{
				setEnemyBuildStrategy(BuildStrategy::Zerg_Build_4Drone_Spawing_Pool);
			}
		}

		if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Mutalisk) > enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Hydralisk) + enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Lurker)) {
			setEnemyBuildStrategy(BuildStrategy::Zerg_Build_Air_Focused);
		}
		else {
			if (enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Lurker) >= 1
				|| enemyUnitData->getNumUnits(BWAPI::UnitTypes::Zerg_Lurker_Egg) >= 1)
			{
				setEnemyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker);
			}
			else {
				setEnemyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk);
			}
		}
	}
}

void StrategyManager::updateMyStrategy()
{

	if (BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Zerg) {
		
		// 적군이 방어 위주 전략이면, 뮤탈 / 드랍 위주 전략으로 변경
		// 적군이 초반 위주 전략이면, 성큰 방어 / 저글링 방어 위주 전략으로 변경

		// TODO : 전략 변경
		// TODO : 전략이 계속 왔다갔다 하지 않도록

		// TODO : 먼저는 적군의 빌드 전략을 파악하여, 이에 대응하는 아군 빌드 전략 및 공격 전략을 설정한다
		// 나중에 적군의 공격 전략을 추가 파악하여, 이에 대응하는 아군 빌드 전략 및 공격 전략을 설정한다
		if (InformationManager::Instance().enemyRace == BWAPI::Races::Protoss)
		{
			// 시작할 때 기본 전략
			if (myCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_9Drone_Hatchery);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Protoss_Build_Hardcore_Zealot) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Lurker_Mutalisk);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Defense_Mutalisk_BackRush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Protoss_Build_Zealot_Dragoon) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Protoss_Build_Ground_Templar) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Protoss_Build_Ground_Reaver) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Protoss_Build_Air_Carrier) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}

		}
		else if (InformationManager::Instance().enemyRace == BWAPI::Races::Terran)
		{
			// 시작할 때 기본 전략
			if (myCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_12Drone_SpawningPool_2Hatchery);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Terran_Build_Bionic) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Terran_Build_Mechanic) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
		}
		// 적 종족이 랜덤이면 일단 저그라고 생각하고 안전하게 플레이
		else if (InformationManager::Instance().enemyRace == BWAPI::Races::Zerg
			|| InformationManager::Instance().enemyRace == BWAPI::Races::Unknown)
		{
			// 시작할 때 기본 전략
			if (myCurrentBuildStrategy == BuildStrategy::BuildStrategy_Unknown) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_9Drone_SpawningPool_1Hatchery);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
				//setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Defense_Mutalisk_BackRush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Zerg_Build_4Drone_Spawing_Pool) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Zerg_Build_Zergling_Hydralisk) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
			else if (enemyCurrentBuildStrategy == BuildStrategy::Zerg_Build_Air_Focused) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}
		}

		// 4드론 러시
		// 상대방 저그 12드론 앞마당 해처리 빌드이거나
		// 상대방 테란 - 길목 안막는 팩토리 빌드이거나
		// 상대방 프로토스 - 포톤캐논 안만드는 빠른 테크트리 빌드일 경우 승리 가능
		//if (enemyRace == BWAPI::Races::Protoss || enemyRace == BWAPI::Races::Zerg) {
			
		//if (BWTA::getStartLocations().size() >= 3) {

		//if (rand() % 8 == 0) {
		//if (true) {
		if (false) {
			// 작은 맵일 경우 한번 더 고려. 바로 정찰와서 간파당하기 때문에
			//if (true) {
			if (false) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_4Drone_Spawing_Pool);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_4Drone_Zergling_Rush);

				// 정찰 저글링 숫자는 처음에는 0
				zerglingScouterNumberFromCombatSquad = 0;
			}
		}

		// 4드론 러시가 성공했든 실패했든 끝났으면 히드라 러커 체계로 넘어가서 방어를 하고 그다음에 뮤탈을 뽑는다 
		if (myCurrentBuildStrategy == BuildStrategy::Zerg_Build_4Drone_Spawing_Pool) {
			if (isCompletedTask(StrategicTask(Attack_Enemy_BaseLocation_With_Early_Zergling_Unit))) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}

			// 시간이 경과하면 전략 변경
			if (BWAPI::Broodwar->getFrameCount() > 24 * 60 * 5) {
				setMyBuildStrategy(BuildStrategy::Zerg_Build_Zergling_Hydralisk_Lurker_Defiler);
				setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Ground_Rush);
			}

		}

		// TODO : 삭제. 테스트용
		if (true) {
			//	setMyBuildStrategy(BuildStrategy::Zerg_Build_Test);
			//	setMyCombatStrategy(CombatStrategy::Zerg_Combat_Front_Defense_Mutalisk_BackRush);
		}
	}
}