namespace RedridgeWeapons
{
    bool g_Registered = false;
    bool g_MappingsApplied = false;

    void RegisterAll()
    {
        if (g_Registered)
            return;

        RedridgeAxe::Register();
        RedridgeCrossbow::Register();
        Redridge9mmHandgun::Register();
        Redridge9mmAR::Register();
        RedridgeShotgun::Register();
        Redridge357::Register();
        RedridgeHandGrenade::Register();

        g_Registered = true;
    }

    void Register()
    {
        RegisterAll();
    }

    void GiveImpulse101Loadout(CBasePlayer@ player)
    {
        if (player is null || !player.IsAlive())
            return;

        const array<string> weapons =
        {
            "weapon_rr_axe",
            "weapon_rr_crossbow",
            "weapon_rr_9mmhandgun",
            "weapon_rr_9mmar",
            "weapon_rr_shotgun",
            "weapon_rr_357",
            "weapon_rr_handgrenade"
        };

        for (uint i = 0; i < weapons.length(); ++i)
        {
            if (player.HasNamedPlayerItem(weapons[i]) is null)
                player.GiveNamedItem(weapons[i]);
        }

        player.GiveAmmo(250, "9mm", 250);
        player.GiveAmmo(10, "ARgrenades", 10);
        player.GiveAmmo(125, "buckshot", 125);
        player.GiveAmmo(36, "357", 36);
        player.GiveAmmo(50, "bolts", 50);
        player.GiveAmmo(10, "Hand Grenade", 10);
    }

    void HandleImpulse101(CBasePlayer@ player)
    {
        if (player is null || player.pev.impulse != 101)
            return;

        if (g_EngineFuncs.CVarGetFloat("sv_cheats") <= 0.0f)
            return;

        player.pev.impulse = 0;

        GiveImpulse101Loadout(player);
    }

    void ApplyMappings()
    {
        if (g_MappingsApplied)
            return;

        array<ItemMapping@> mappings;

        mappings.insertLast(ItemMapping("weapon_crowbar", "weapon_rr_axe"));
        mappings.insertLast(ItemMapping("weapon_crossbow", "weapon_rr_crossbow"));

        mappings.insertLast(ItemMapping("weapon_9mmhandgun", "weapon_rr_9mmhandgun"));
        mappings.insertLast(ItemMapping("weapon_glock", "weapon_rr_9mmhandgun"));
        mappings.insertLast(ItemMapping("weapon_9mmAR", "weapon_rr_9mmar"));
        mappings.insertLast(ItemMapping("weapon_mp5", "weapon_rr_9mmar"));
        mappings.insertLast(ItemMapping("weapon_m16", "weapon_rr_9mmar"));
        mappings.insertLast(ItemMapping("weapon_shotgun", "weapon_rr_shotgun"));
        mappings.insertLast(ItemMapping("weapon_357", "weapon_rr_357"));
        mappings.insertLast(ItemMapping("weapon_python", "weapon_rr_357"));
        mappings.insertLast(ItemMapping("weapon_handgrenade", "weapon_rr_handgrenade"));

        g_ClassicMode.SetItemMappings(mappings);
        g_ClassicMode.ForceItemRemap(true);

        g_MappingsApplied = true;
    }
}
