#include "ChangeOrientationBehavior.h"
#include "BehaviorBranchContext.h"
#include "BehaviorContext.h"
#include "EntityManager.h"
#include "BaseCombatAIComponent.h"

void ChangeOrientationBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
}

void ChangeOrientationBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
	if (!m_ToTarget) return; // TODO: Add the other arguments to this behavior

	auto* self = EntityManager::Instance()->GetEntity(context->originator);
	auto* other = EntityManager::Instance()->GetEntity(branch.target);

	if (self == nullptr || other == nullptr) return;

	const auto source = self->GetPosition();
	const auto destination = self->GetPosition();

	if (m_OrientCaster) {
		auto* baseCombatAIComponent = self->GetComponent<BaseCombatAIComponent>();

		/*if (baseCombatAIComponent != nullptr)
		{
			baseCombatAIComponent->LookAt(destination);
		}
		else*/
		{
			self->SetRotation(NiQuaternion::LookAt(source, destination));
		}

		EntityManager::Instance()->SerializeEntity(self);
	} else {
		other->SetRotation(NiQuaternion::LookAt(destination, source));

		EntityManager::Instance()->SerializeEntity(other);
	}
}

void ChangeOrientationBehavior::Load() {
	m_OrientCaster = GetBoolean("orient_caster");
	m_ToTarget = GetBoolean("to_target");
}