#pragma once

#include <vector>

#include "dCommonVars.h"

#include "ItemSetPassiveAbility.h"

class InventoryComponent;

/**
 * A set of items that can be worn together for special bonuses, for example faction gear.
 */
class ItemSet
{
public:
	explicit ItemSet(uint32_t id, InventoryComponent* inventoryComponent);
	void Update(float deltaTime);

	/**
	 * Returns if this item set contains the LOT specified
	 * @param lot the lot to check for
	 * @return if this item set contains the LOT specified
	 */
	bool Contains(LOT lot);

	/**
	 * Equips the item set skill for this LOT (if it's in the item set)
	 * @param lot the LOT of the item to equip skills for
	 */
	void OnEquip(LOT lot);

	/**
	 * Unequips the item set skill for this LOT (if it's in the item set)
	 * @param lot the LOT of the item to unequip skills for
	 */
	void OnUnEquip(LOT lot);

	/**
	 * Returns the number of items in the item set that are currently equipped
	 * @return the number of items in the item set that are currently equipped
	 */
	uint32_t GetEquippedCount() const;

	/**
	 * Returns the ID of this item set
	 * @return the ID of this item set
	 */
	uint32_t GetID() const;

	/**
	 * Triggers all the passive abilities in this item set that match this trigger
	 * @param trigger the trigger to use to trigger passive abilities
	 */
	void TriggerPassiveAbility(PassiveAbilityTrigger trigger);

	/**
	 * Returns the skills that can be equipped for a specified amount of equipped items
	 * @param itemCount the amount of items equipped to check for
	 * @return the skills that can be equipped for a specified amount of equipped items
	 */
	std::vector<uint32_t> GetSkillSet(uint32_t itemCount) const;

private:
	/**
	 * The ID of this skill set
	 */
	uint32_t m_ID;

	/**
	 * The inventory this skill set belongs to
	 */
	InventoryComponent* m_InventoryComponent;

	/**
	 * The items in the skill set that are currently equipped
	 */
	std::vector<LOT> m_Equipped;

	/**
	 * The total list of items in this skill set
	 */
	std::vector<LOT> m_Items;

	/**
	 * The skills that can be triggered when 2 items are equipped
	 */
	std::vector<uint32_t> m_SkillsWith2;

	/**
	 * The skills that can be triggered when 3 items are equipped
	 */
	std::vector<uint32_t> m_SkillsWith3;

	/**
	 * The skills that can be triggered when 4 items are equipped
	 */
	std::vector<uint32_t> m_SkillsWith4;

	/**
	 * The skills that can be triggered when 5 items are equipped
	 */
	std::vector<uint32_t> m_SkillsWith5;

	/**
	 * The skills that can be triggered when 6 items are equipped
	 */
	std::vector<uint32_t> m_SkillsWith6;

	/**
	 * The passive abilities associated with this skill set
	 */
	std::vector<ItemSetPassiveAbility> m_PassiveAbilities;
};