#include "Strategy_BuildTaskManager.h"

using namespace MyBot;


void StrategyManager::updateScoutTask()
{
	if (BWAPI::Broodwar->getFrameCount() % 6 != 0) {
		return;
	}

	BWAPI::Unit targetEnemyUnit = nullptr;
	BWAPI::Position targetEnemyUnitPosition = BWAPI::Positions::None;

	if (BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Zerg) {

		// 적군 종족에 따른 정찰 타스크
		if (true) {

			// 적군 종족을 모를 경우, 빠른 저글링 공격에 대비하여 9번째 드론으로 정찰
			if (InformationManager::Instance().enemyRace == BWAPI::Races::Unknown) {
				workerScoutCondition_completedWorkerCount = 9;
				isToScoutWithWorker = true;

				// 타스크 추가 : 적군 종족 파악. 도중에 프로토스 / 테란 이라는 것이 알려지면, 일꾼은 그냥 돌아와도 된다
				insertTask(StrategicTask(TaskGoalType::Figure_Out_Enemy_Race));
			}
			// 적군 종족이 저그일 경우, 빠른 저글링 공격에 대비하여 9드론 스포닝풀 빌드오더로 대응
			else if (InformationManager::Instance().enemyRace == BWAPI::Races::Zerg) {
				isToScoutWithWorker = false;
				cancelScoutDroneSquad();
			}
			// 적군 종족이 프로토스, 테란이면,  오버로드나 저글링으로만 정찰
			else if (InformationManager::Instance().enemyRace == BWAPI::Races::Protoss || InformationManager::Instance().enemyRace == BWAPI::Races::Terran) {
				isToScoutWithWorker = false;
				cancelScoutDroneSquad();
			}
		}

		// 적군 상황 및 아군 상황에 따른 정찰 타스크
		if (true) {

			// 적군 본진을 모르는 상황
			if (enemyMainBaseLocation == nullptr) {
				// 타스크 추가 : 적군 본진 위치 파악
				insertTask(StrategicTask(TaskGoalType::Figure_Out_Enemy_BaseLocation));
			}

			if (enemyMainBaseLocation != nullptr) {

				// 적군 본진을 안가봤거나, 가본지 2분 이상 된 상황
				if (baseLocationStatusMap[enemyMainBaseLocation].lastVisibleTime < 0
					|| BWAPI::Broodwar->getFrameCount() - baseLocationStatusMap[enemyMainBaseLocation].lastVisibleTime >= 20 * 60 * 2) {
					insertTask(StrategicTask(TaskGoalType::Scout_Enemy_MainBaseLocation));
				}

				// 적군 본진을 한번 가보기는 했고, 건물이 하나도 없게된 경우, 적군 본진을 더 둘러보는 한편 다른 베이스도 둘러본다
				if (BWAPI::Broodwar->isExplored(enemyMainBaseLocation->getTilePosition())
					&& InformationManager::Instance().existsPlayerBuildingInRegion(BWTA::getRegion(enemyMainBaseLocation->getTilePosition()), enemyPlayer))
				{
					// TODO : 본진 주위 둘러보기
					insertTask(StrategicTask(TaskGoalType::Scout_Enemy_MainBaseLocation));
				}
			}

			// 적군 앞마당을 안가봤거나, 가본지 2분 이상 된 상황 
			if (enemyFirstExpansionBaseLocation != nullptr) {
				if (baseLocationStatusMap[enemyFirstExpansionBaseLocation].lastVisibleTime < 0
					|| BWAPI::Broodwar->getFrameCount() - baseLocationStatusMap[enemyFirstExpansionBaseLocation].lastVisibleTime >= 20 * 60 * 2) {
					insertTask(StrategicTask(TaskGoalType::Scout_Enemy_First_Expansion));
				}
			}

			// 적군 첫번째 길목을 안가봤거나, 가본지 2분 이상 된 상황 
			/*
			if (enemyMainBaseLocation != nullptr) {
				if (chokepointStatusMap[enemyFirstChokepoint].lastVisibleTime < 0
					|| BWAPI::Broodwar->getFrameCount() - chokepointStatusMap[enemyFirstChokepoint].lastVisibleTime >= 20 * 60 * 2) {
					insertTask(StrategicTask(TaskGoalType::Scout_Enemy_Chokepoint));
				}
			}
			*/

			// 적군의 멀티에 대해, 가본지 2분 이상 된 베이스가 있는 상황 
			if (InformationManager::Instance().getOccupiedBaseLocations(InformationManager::Instance().enemyPlayer).size() > 1) {
				for (BWTA::BaseLocation * baseLocation : BWTA::getBaseLocations()) {
					if (baseLocationStatusMap[baseLocation].locationStatus == LocationStatus::Enemy_Occupied) {
						if (baseLocationStatusMap[baseLocation].lastVisibleTime < 0
							|| BWAPI::Broodwar->getFrameCount() - baseLocationStatusMap[baseLocation].lastVisibleTime >= 20 * 60 * 2) {
							insertTask(StrategicTask(TaskGoalType::Scout_Enemy_Other_Expansion, BWAPI::UnitTypes::None, BWAPI::TechTypes::None, BWAPI::UpgradeTypes::None, nullptr,
								baseLocation->getPosition(), 1));
						}
					}
				}
			}

			// 안가본 베이스가 있거나, 가본지 2분 이상 된 베이스가 있는 상황 
			if (enemyMainBaseLocation != nullptr) {
				bool isThereInvisibleBase = false;
				for (BWTA::BaseLocation * baseLocation : BWTA::getBaseLocations()) {
					if (baseLocationStatusMap[baseLocation].lastVisibleTime < 0
						|| BWAPI::Broodwar->getFrameCount() - baseLocationStatusMap[baseLocation].lastVisibleTime >= 20 * 60 * 2) {
						insertTask(StrategicTask(TaskGoalType::Scout_Empty_BaseLocations));
						break;
					}
				}
			}

			// 오버로드가 돌아다닐수는 있으나 조금 위험한 상황이 되면, 언덕 위쪽같은 곳으로만 다닌다
			if (isEnemyHasDangerousUnitToOverlord == false) {
				if (getEnemyHasDangerousUnitToOverlord() == true) {
					std::cout << "isEnemyHasDangerousUnitToOverlord = true -> moveToSafePosition " << std::endl;
					isEnemyHasDangerousUnitToOverlord = true;
				}
			}

			// 오버로드가 돌아다니기에 매우 위험한 상황이 되면, 정찰에는 전혀 사용하지 않는다
			if (isToScoutWithOverlord == true) {
				if (isVeryDangerousToEveryOverlord())
				{
					isToScoutWithOverlord = false;
					std::cout << "isVeryDangerousToEveryOverlord = true -> cancelScoutOverlordSquad" << std::endl;
					cancelScoutOverlordSquad();
				}
			}

			// 일꾼이 돌아다니기에 매우 위험한 상황이 되면, 정찰에는 전혀 사용하지 않는다
			if (isToScoutWithWorker == true) {
				if (isVeryDangerousToScoutWithDrone())
				{
					std::cout << "isVeryDangerousToScoutWithDrone = true -> cancelScoutDroneSquad " << std::endl;
					isToScoutWithWorker = false;
					cancelScoutDroneSquad();
				}
			}

			// TODO : 저글링을 가끔 정찰하러 찔러본다

			// TODO : 일꾼으로 할 수 있는 정찰 목표가 다 달성되었으면, 정찰에는 사용하지 않는다
			// 일꾼 정찰은, 적 종족이 랜덤일 경우 종족 확인,
			// 적 종족이 저그일 경우 초반 러시 여부 확인에만 사용한다
		}


		// 아군 전략에 따른 정찰 타스크
		if (true) {
			// 아군 전투전략이 4드론 저글링 러시이면, 적군 종족을 모르거나 저그일 경우라도, 일꾼으로 정찰하지 않는다
			if (myCurrentCombatStrategy == Zerg_Combat_4Drone_Zergling_Rush) {
				workerScoutCondition_completedWorkerCount = -1;
				isToScoutWithWorker = false;
			}

			// 러커 생산 시 적군 근처 멀티 지역 / 길목부터 하나씩 깔아두기
			if (isToBurrowOnEmptyBaseLocation) {

				if (BWAPI::Broodwar->self()->completedUnitCount(BWAPI::UnitTypes::Zerg_Lurker) >= 5) {

					// Eliminate 시키기 모드가 아닌 경우에만
					if (StrategyManager::Instance().taskList.find(StrategicTask(Eliminate_Enemy_Player)) == StrategyManager::Instance().taskList.end()) {
						insertTask(StrategicTask(TaskGoalType::Burrow_On_Empty_BaseLocation, BWAPI::UnitTypes::None, BWAPI::TechTypes::None, BWAPI::UpgradeTypes::None, nullptr, BWAPI::Positions::None, 0));
					}
				}
			}

			/*
			// 입구 막기 위한 건물 지을 곳에 버로우 저글링은 해봐야 소용없음
			// 커맨드 센터 옆 컴셋 등 Addon 건물 지을 곳에 버로우  : 해봐야, 지을 수 있음
			for (auto & it : InformationManager::Instance().getUnitAndUnitInfoMap(InformationManager::Instance().enemyPlayer)) {
			BWAPI::Unit enemyUnit = it.first;
			UnitInfo & enemyUnitInfo = it.second;

			if (enemyUnitInfo.type.canBuildAddon()) {
			if (enemyUnit->getAddon() == nullptr)
			{
			// Addon 건물 짓는 위치는 원 건물 우측하단
			// Addon 건물은 2 * 2 타일 사이즈
			BWAPI::TilePosition targetTilePosition = enemyUnit->getTilePosition();
			targetTilePosition.x += enemyUnitInfo.type.tileWidth()+1;
			targetTilePosition.y += 1+1;

			BWAPI::Position targetPosition(targetTilePosition.x * TILE_SIZE, targetTilePosition.y * TILE_SIZE);

			insertTask(StrategicTask(TaskGoalType::Burrow_On_Empty_BaseLocation, BWAPI::UnitTypes::None, BWAPI::TechTypes::None, BWAPI::UpgradeTypes::None, nullptr,
			targetPosition, 0));
			}

			}
			*/

		}

		// 적군 전략에 따른 정찰 타스크

	}

}
