#pragma once

// Custom Classes
#include "CDTable.h"

/*!
 \file CDSkillBehaviorTable.hpp
 \brief Contains data for the SkillBehavior table
 */

//! ZoneTable Struct
struct CDSkillBehavior {
    unsigned int skillID;               //!< The Skill ID of the skill
    UNUSED(unsigned int locStatus);             //!< ??
    unsigned int behaviorID;            //!< The Behavior ID of the skill
    unsigned int imaginationcost;       //!< The imagination cost of the skill
    unsigned int cooldowngroup;         //!< The cooldown group ID of the skill
    float cooldown;             //!< The cooldown time of the skill
    UNUSED(bool isNpcEditor);           //!< ???
    UNUSED(unsigned int skillIcon);             //!< The Skill Icon ID
    UNUSED(std::string oomSkillID);        //!< ???
    UNUSED(unsigned int oomBehaviorEffectID);   //!< ???
    UNUSED(unsigned int castTypeDesc);          //!< The cast type description(?)
    UNUSED(unsigned int imBonusUI);             //!< The imagination bonus of the skill
    UNUSED(nsigned int lifeBonusUI);           //!< The life bonus of the skill
    UNUSED(unsigned int armorBonusUI);          //!< The armor bonus of the skill
    UNUSED(unsigned int damageUI);             //!< ???
    UNUSED(bool hideIcon);              //!< Whether or not to show the icon
    UNUSED(bool localize);              //!< ???
    UNUSED(std::string gate_version);      //!< ???
    UNUSED(unsigned int cancelType);            //!< The cancel type (?)
};

//! SkillBehavior table
class CDSkillBehaviorTable : public CDTable {
private:
    std::map<unsigned int, CDSkillBehavior> entries;
    CDSkillBehavior m_empty;

public:

    //! Constructor
    CDSkillBehaviorTable(void);

    //! Destructor
    ~CDSkillBehaviorTable(void);

    //! Returns the table's name
    /*!
     \return The table name
     */
    std::string GetName(void) const override;

    //! Queries the table with a custom "where" clause
    /*!
     \param predicate The predicate
     */
    std::vector<CDSkillBehavior> Query(std::function<bool(CDSkillBehavior)> predicate);

    //! Gets an entry by ID
    const CDSkillBehavior& GetSkillByID(unsigned int skillID);
};