#include "ChainBehavior.h"
#include "BehaviorBranchContext.h"
#include "Game.h"
#include "Logger.h"

void ChainBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
	uint32_t chainIndex{};

	if (!bitStream.Read(chainIndex)) {
		LOG("Unable to read chainIndex from bitStream, aborting Handle! %i", bitStream.GetNumberOfUnreadBits());
		return;
	}

	chainIndex--;

	if (chainIndex < this->m_behaviors.size()) {
		this->m_behaviors.at(chainIndex)->Handle(context, bitStream, branch);
	} else {
		LOG("chainIndex out of bounds, aborting handle of chain %i bits unread %i", chainIndex, bitStream.GetNumberOfUnreadBits());
	}
}

void ChainBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
	bitStream.Write(1);

	this->m_behaviors.at(0)->Calculate(context, bitStream, branch);
}

void ChainBehavior::Load() {
	const auto parameters = GetParameterNames();

	for (const auto& parameter : parameters) {
		if (parameter.first.rfind("behavior", 0) == 0) {
			auto* action = GetAction(parameter.second);

			this->m_behaviors.push_back(action);
		}
	}
}