#pragma once

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

// possession types
enum class ePossessionType : uint8_t {
	NO_POSSESSION = 0,
	ATTACHED_VISIBLE,
	NOT_ATTACHED_VISIBLE,
	NOT_ATTACHED_NOT_VISIBLE,
};

/**
 * Represents an entity that can posess other entities. Generally used by players to drive a car.
 */
class PossessorComponent : public Component {
public:
	static const uint32_t ComponentType = COMPONENT_TYPE_POSSESSOR;

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

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

	/**
	 * Sets the entity that this entity is possessing
	 * @param value the ID of the entity this ID should posess
	 */
	void SetPossessable(LWOOBJID value) { m_Possessable = value; m_DirtyPossesor = true; }

	/**
	 * Returns the entity that this entity is currently posessing
	 * @return the entity that this entity is currently posessing
	 */
	LWOOBJID GetPossessable() const { return m_Possessable; }

	/**
	 * Sets if we are busy mounting or dismounting
	 * @param value if we are busy mounting or dismounting
	 */
	void SetIsBusy(bool value) { m_IsBusy = value; }

	/**
	 * Returns if we are busy mounting or dismounting
	 * @return if we are busy mounting or dismounting
	 */
	bool GetIsBusy() const { return m_IsBusy; }

	/**
	 * Sets the possesible type that's currently used, merely used by the shooting gallery if it's 0
	 * @param value the possesible type to set
	 */
	void SetPossessableType(ePossessionType value) { m_PossessableType = value; m_DirtyPossesor = true; }

private:

	/**
	 * The ID of the entity this entity is possessing (e.g. the ID of a car)
	 */
	LWOOBJID m_Possessable = LWOOBJID_EMPTY;

	/**
	 * @brief possessable type
	 *
	 */
	ePossessionType m_PossessableType = ePossessionType::NO_POSSESSION;

	/**
	 * @brief if the possessor is dirty
	 *
	 */
	bool m_DirtyPossesor = false;

	/**
	 * @brief if the possessor is busy mounting or dismounting
	 *
	 */
	bool m_IsBusy = false;
};
