#include "FvFlyingCreviceDragon.h"
#include "GameMessages.h"
#include "EntityManager.h"
#include "SkillComponent.h"
#include "GeneralUtils.h"

void FvFlyingCreviceDragon::OnStartup(Entity* self) {
	self->AddTimer("waypoint", 5);
}

void FvFlyingCreviceDragon::OnTimerDone(Entity* self, std::string timerName) {
	if (timerName == "waypoint") {
		auto point = self->GetVar<int32_t>(u"waypoint");

		if (point >= 20) {
			point = 0;
		}

		self->SetVar<int32_t>(u"waypoint", point + 1);

		self->AddTimer("waypoint", 5);

		OnArrived(self);

		return;
	}

	std::string groupName = "";

	if (timerName == "platform1attack") {
		groupName = "dragonFireballs1";
	} else if (timerName == "platform3attack") {
		groupName = "dragonFireballs3";
	}

	const auto& group = EntityManager::Instance()->GetEntitiesInGroup(groupName);

	if (group.empty()) {
		return;
	}

	auto* skillComponent = group[0]->GetComponent<SkillComponent>();

	if (skillComponent != nullptr) {
		skillComponent->CalculateBehavior(762, 12506, LWOOBJID_EMPTY, true);
	}

	auto minionCount = 1;
	for (size_t i = 1; i < group.size(); i++) {
		if (minionCount == 4) {
			return;
		}

		if (/*GeneralUtils::GenerateRandomNumber<int32_t>(1, 5) > 3*/ true) {
			skillComponent = group[i]->GetComponent<SkillComponent>();

			if (skillComponent != nullptr) {
				skillComponent->CalculateBehavior(762, 12506, LWOOBJID_EMPTY);

				++minionCount;
			}
		}
	}
}

void FvFlyingCreviceDragon::OnArrived(Entity* self) {
	auto point = self->GetVar<int32_t>(u"waypoint");

	if (point == 4) {
		GameMessages::SendPlayAnimation(self, u"attack1", 2);
		self->AddTimer("platform1attack", 1.75f);
	} else if (point == 12) {
		GameMessages::SendPlayAnimation(self, u"attack2", 2);

		const auto& group2 = EntityManager::Instance()->GetEntitiesInGroup("dragonFireballs2");

		if (group2.empty()) {
			return;
		}

		auto* skillComponent = group2[0]->GetComponent<SkillComponent>();

		if (skillComponent != nullptr) {
			skillComponent->CalculateBehavior(762, 12506, LWOOBJID_EMPTY);
		}

		auto minionCount = 1;
		for (size_t i = 1; i < group2.size(); i++) {
			if (minionCount == 4) {
				return;
			}

			if (GeneralUtils::GenerateRandomNumber<int32_t>(1, 5) > 3) {
				skillComponent = group2[i]->GetComponent<SkillComponent>();

				if (skillComponent != nullptr) {
					skillComponent->CalculateBehavior(762, 12506, LWOOBJID_EMPTY, true);

					++minionCount;
				}
			}
		}
	} else if (point == 16) {
		GameMessages::SendPlayAnimation(self, u"attack3", 2);
		self->AddTimer("platform3attack", 0.5f);
	}
}