#include "ModuleAssemblyComponent.h"

ModuleAssemblyComponent::ModuleAssemblyComponent(Entity* parent) : Component(parent) {
	m_SubKey = LWOOBJID_EMPTY;
	m_UseOptionalParts = false;
	m_AssemblyPartsLOTs = u"";
}

ModuleAssemblyComponent::~ModuleAssemblyComponent() {

}

void ModuleAssemblyComponent::SetSubKey(LWOOBJID value) {
	m_SubKey = value;
}

LWOOBJID ModuleAssemblyComponent::GetSubKey() const {
	return m_SubKey;
}

void ModuleAssemblyComponent::SetUseOptionalParts(bool value) {
	m_UseOptionalParts = value;
}

bool ModuleAssemblyComponent::GetUseOptionalParts() const {
	return m_UseOptionalParts;
}

void ModuleAssemblyComponent::SetAssemblyPartsLOTs(const std::u16string& value) {
	std::u16string val{};

	val.reserve(value.size() + 1);

	for (auto character : value) {
		if (character == '+') character = ';';

		val.push_back(character);
	}

	val.push_back(';');

	m_AssemblyPartsLOTs = val;
}

const std::u16string& ModuleAssemblyComponent::GetAssemblyPartsLOTs() const {
	return m_AssemblyPartsLOTs;
}

void ModuleAssemblyComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) {
	if (bIsInitialUpdate) {
		outBitStream->Write1();

		outBitStream->Write(m_SubKey != LWOOBJID_EMPTY);
		if (m_SubKey != LWOOBJID_EMPTY) {
			outBitStream->Write(m_SubKey);
		}

		outBitStream->Write(m_UseOptionalParts);

		outBitStream->Write(static_cast<uint16_t>(m_AssemblyPartsLOTs.size()));
		for (char16_t character : m_AssemblyPartsLOTs) {
			outBitStream->Write(character);
		}
	}
}

void ModuleAssemblyComponent::Update(float deltaTime) {

}