#pragma once

#include "BitStream.h"
#include "Entity.h"
#include "Component.h"
#include "eReplicaComponentType.h"

/**
 * Component that belongs to an object that may be modularly built, like cars and rockets. Note that this is not the
 * same as having said items in your inventory (the subkey for this component) this component is the one that
 * renders the entity into the world.
 */
class ModuleAssemblyComponent : public Component {
public:
	static const eReplicaComponentType ComponentType = eReplicaComponentType::MODULE_ASSEMBLY;

	ModuleAssemblyComponent(Entity* parent);
	~ModuleAssemblyComponent() override;

	void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags);
	void Update(float deltaTime) override;

	/**
	 * Sets the subkey of this entity
	 * @param value the subkey to set
	 */
	void SetSubKey(LWOOBJID value);

	/**
	 * Returns the subkey for this entity
	 * @return the subkey for this entity
	 */
	LWOOBJID GetSubKey() const;


	/**
	 * Sets the optional parts value
	 * @param value the value to set
	 */
	void SetUseOptionalParts(bool value);

	/**
	 * Returns the optional parts value
	 * @return the value to set
	 */
	bool GetUseOptionalParts() const;

	/**
	 * Sets the assembly part lots (the subsections of this modular build)
	 * @param value the assembly part lots to set
	 */
	void SetAssemblyPartsLOTs(const std::u16string& value);

	/**
	 * Returns the assembly part lots (the subsections of this modular build)
	 * @return
	 */
	const std::u16string& GetAssemblyPartsLOTs() const;

private:

	/**
	 * The sub key is the entity that this entity is an instance of. E.g. the item in the inventory. If a car for
	 * example is to be rendered, this sub key refers to the car item that was used to build this entity.
	 */
	LWOOBJID m_SubKey;

	/**
	 * Whether to use optional parts, currently unused
	 */
	bool m_UseOptionalParts;

	/**
	 * The sub items that this entity is made of
	 */
	std::u16string m_AssemblyPartsLOTs;
};