#ifndef MAGIC_HPP_INCLUDED
#define MAGIC_HPP_INCLUDED

#include <string>
#include <cstdint>

namespace Magic
{
    typedef enum SPELL
    {
        NORMAL_LUMBRIDGE_HOME_TELEPORT,
        NORMAL_WIND_STRIKE,
        NORMAL_CONFUSE,
        NORMAL_ENCHANT_CROSSBOW_BOLT,
        NORMAL_WATER_STRIKE,
        NORMAL_LVL1_ENCHANT,
        NORMAL_EARTH_STRIKE,
        NORMAL_WEAKEN,
        NORMAL_FIRE_STRIKE,
        NORMAL_BONES_TO_BANANAS,
        NORMAL_WIND_BOLT,
        NORMAL_CURSE,
        NORMAL_BIND,
        NORMAL_LOW_LEVEL_ALCHEMY,
        NORMAL_WATER_BOLT,
        NORMAL_VARROCK_TELEPORT,
        NORMAL_LVL2_ENCHANT,
        NORMAL_EARTH_BOLT,
        NORMAL_LUMBRIDGE_TELEPORT,
        NORMAL_TELEKINETIC_GRAB,
        NORMAL_FIRE_BOLT,
        NORMAL_FALADOR_TELEPORT,
        NORMAL_CRUMBLE_UNDEAD,
        NORMAL_TELEPORT_TO_HOUSE,
        NORMAL_WIND_BLAST,
        NORMAL_SUPERHEAT_ITEM,
        NORMAL_CAMELOT_TELEPORT,
        NORMAL_WATER_BLAST,
        NORMAL_LVL3_ENCHANT,
        NORMAL_IBAN_BLAST,
        NORMAL_SNARE,
        NORMAL_MAGIC_DART,
        NORMAL_ARDOUGNE_TELEPORT,
        NORMAL_EARTH_BLAST,
        NORMAL_HIGH_LEVEL_ALCHEMY,
        NORMAL_CHARGE_WATER_ORB,
        NORMAL_LVL4_ENCHANT,
        NORMAL_WATCHTOWER_TELEPORT,
        NORMAL_FIRE_BLAST,
        NORMAL_CHARGE_EARTH_ORB,
        NORMAL_BONES_TO_PEACHES,
        NORMAL_SARADOMIN_STRIKE,
        NORMAL_CLAWS_OF_GUTHIX,
        NORMAL_FLAMES_OF_ZAMORAK,
        NORMAL_TROLLHEIM_TELEPORT,
        NORMAL_WIND_WAVE,
        NORMAL_CHARGE_FIRE_ORB,
        NORMAL_TELEPORT_TO_APE_ATOLL,
        NORMAL_WATER_WAVE,
        NORMAL_CHARGE_AIR_ORB,
        NORMAL_VULNERABILITY,
        NORMAL_LVL5_ENCHANT,
        NORMAL_TELEPORT_TO_KOUREND,
        NORMAL_EARTH_WAVE,
        NORMAL_ENFEEBLE,
        NORMAL_TELEOTHER_LUMBRIDGE,
        NORMAL_FIRE_WAVE,
        NORMAL_ENTANGLE,
        NORMAL_STUN,
        NORMAL_CHARGE,
        NORMAL_WIND_SURGE,
        NORMAL_TELEOTHER_FALADOR,
        NORMAL_WATER_SURGE,
        NORMAL_TELE_BLOCK,
        NORMAL_TELEPORT_TO_BOUNTY_TARGET,
        NORMAL_LVL6_ENCHANT,
        NORMAL_TELEOTHER_CAMELOT,
        NORMAL_EARTH_SURGE,
        NORMAL_LVL7_ENCHANT,
        NORMAL_FIRE_SURGE,

        LUNAR_LUNAR_HOME_TELEPORT,
        LUNAR_BAKE_PIE,
        LUNAR_GEOMANCY,
        LUNAR_CURE_PLANT,
        LUNAR_MONSTER_EXAMINE,
        LUNAR_NPC_CONTACT,
        LUNAR_CURE_OTHER,
        LUNAR_HUMIDIFY,
        LUNAR_MOONCLAN_TELEPORT,
        LUNAR_TELE_GROUP_MOONCLAN,
        LUNAR_CURE_ME,
        LUNAR_OURANIA_TELEPORT,
        LUNAR_HUNTER_KIT,
        LUNAR_WATERBIRTH_TELEPORT,
        LUNAR_TELE_GROUP_WATERBIRTH,
        LUNAR_CURE_GROUP,
        LUNAR_STAT_SPY,
        LUNAR_BARBARIAN_TELEPORT,
        LUNAR_TELE_GROUP_BARBARIAN,
        LUNAR_SPIN_FLAX,
        LUNAR_SUPERGLASS_MAKE,
        LUNAR_TAN_LEATHER,
        LUNAR_KHAZARD_TELEPORT,
        LUNAR_TELE_GROUP_KHAZARD,
        LUNAR_DREAM,
        LUNAR_STRING_JEWELLERY,
        LUNAR_STAT_RESTORE_POT_SHARE,
        LUNAR_MAGIC_IMBUE,
        LUNAR_FERTILE_SOIL,
        LUNAR_BOOST_POTION_SHARE,
        LUNAR_FISHING_GUILD_TELEPORT,
        LUNAR_TELEPORT_TO_BOUNTY_TARGET,
        LUNAR_TELE_GROUP_FISHING_GUILD,
        LUNAR_PLANK_MAKE,
        LUNAR_CATHERBY_TELEPORT,
        LUNAR_TELE_GROUP_CATHERBY,
        LUNAR_RECHARGE_DRAGONSTONE,
        LUNAR_ICE_PLATEAU_TELEPORT,
        LUNAR_TELE_GROUP_ICE_PLATEAU,
        LUNAR_ENERGY_TRANSFER,
        LUNAR_HEAL_OTHER,
        LUNAR_VENGEANCE_OTHER,
        LUNAR_VENGEANCE,
        LUNAR_HEAL_GROUP,
        LUNAR_SPELLBOOK_SWAP,

        ANCIENT_ICE_RUSH,
        ANCIENT_ICE_BLITZ,
        ANCIENT_ICE_BURST,
        ANCIENT_ICE_BARRAGE,
        ANCIENT_BLOOD_RUSH,
        ANCIENT_BLOOD_BLITZ,
        ANCIENT_BLOOD_BURST,
        ANCIENT_BLOOD_BARRAGE,
        ANCIENT_SMOKE_RUSH,
        ANCIENT_SMOKE_BLITZ,
        ANCIENT_SMOKE_BURST,
        ANCIENT_SMOKE_BARRAGE,
        ANCIENT_SHADOW_RUSH,
        ANCIENT_SHADOW_BLITZ,
        ANCIENT_SHADOW_BURST,
        ANCIENT_SHADOW_BARRAGE,
        ANCIENT_PADDEWWA_TELEPORT,
        ANCIENT_SENNTISTEN_TELEPORT,
        ANCIENT_KHARYRLL_TELEPORT,
        ANCIENT_LASSAR_TELEPORT,
        ANCIENT_DAREEYAK_TELEPORT,
        ANCIENT_CARRALLANGAR_TELEPORT,
        ANCIENT_ANNAKARL_TELEPORT,
        ANCIENT_GHORROCK_TELEPORT,
        ANCIENT_TELEPORT_TO_BOUNTY_TARGET,
        ANCIENT_EDGEVILLE_HOME_TELEPORT,

        ARCEUUS_ARCEUUS_HOME_TELEPORT,
        ARCEUUS_REANIMATE_GOBLIN,
        ARCEUUS_LUMBRIDGE_GRAVEYARD_TELEPORT,
        ARCEUUS_REANIMATE_MONKEY,
        ARCEUUS_REANIMATE_IMP,
        ARCEUUS_REANIMATE_MINOTAUR,
        ARCEUUS_DRAYNOR_MANOR_TELEPORT,
        ARCEUUS_REANIMATE_SCORPION,
        ARCEUUS_REANIMATE_BEAR,
        ARCEUUS_REANIMATE_UNICORN,
        ARCEUUS_REANIMATE_DOG,
        ARCEUUS_MIND_ALTAR_TELEPORT,
        ARCEUUS_REANIMATE_CHAOS_DRUID,
        ARCEUUS_RESPAWN_TELEPORT,
        ARCEUUS_REANIMATE_GIANT,
        ARCEUUS_SALVE_GRAVEYARD_TELEPORT,
        ARCEUUS_REANIMATE_OGRE,
        ARCEUUS_REANIMATE_ELF,
        ARCEUUS_REANIMATE_TROLL,
        ARCEUUS_FENKENSTRAINS_CASTLE_TELEPORT,
        ARCEUUS_REANIMATE_HORROR,
        ARCEUUS_REANIMATE_KALPHITE,
        ARCEUUS_WEST_ARDOUGNE_TELEPORT,
        ARCEUUS_REANIMATE_DAGANNOTH,
        ARCEUUS_REANIMATE_BLOODVELD,
        ARCEUUS_HARMONY_ISLAND_TELEPORT,
        ARCEUUS_REANIMATE_TZHAAR,
        ARCEUUS_CEMETERY_TELEPORT,
        ARCEUUS_REANIMATE_DEMON,
        ARCEUUS_REANIMATE_AVIANSIE,
        ARCEUUS_RESURRECT_CROPS,
        ARCEUUS_BARROWS_TELEPORT,
        ARCEUUS_REANIMATE_ABYSSAL_CREATURE,
        ARCEUUS_APE_ATOLL_TELEPORT,
        ARCEUUS_REANIMATE_DRAGON,
        ARCEUUS_BATTLEFRONT_TELEPORT,

        NONE
    } SPELL;

    bool IsOpen();
    bool Open(bool UseHotkey = false);
    std::int32_t GetTabHotkey();

    bool HasLevel(const SPELL& Spell);

    bool IsSpellSelected();
    bool IsSpellSelected(const SPELL& Spell);
    bool IsSpellSelected(const std::string& Name);
    std::string GetSelectedSpellName();
    const SPELL GetSelectedSpell();

    bool CastSpell(const SPELL& Spell);
    bool CastSpell(const SPELL& Spell, const std::string& Option);
    bool SelectSpell(const SPELL& Spell);
}

#endif // MAGIC_HPP_INCLUDED
