#ifndef __PSHAG_CCONTROLMAPPER_HPP__
#define __PSHAG_CCONTROLMAPPER_HPP__

namespace pshag
{
class CFinalInput;

class ControlMapper
{
public:
    enum class ECommands
    {
        Forward,
        Backward,
        TurnLeft,
        TurnRight,
        StrafeLeft,
        StrafeRight,
        LookLeft,
        LookRight,
        LookUp,
        LookDown,
        JumpOrBoost,
        FireOrBomb,
        MissileOrPowerBomb,
        Morph,
        AimUp,
        AimDown,
        CycleBeamUp,
        CycleBeamDown,
        CycleItem,
        PowerBeam,
        IceBeam,
        WaveBeam,
        PlasmaBeam,
        ToggleHolster,
        OrbitClose,
        OrbitFar,
        OrbitObject,
        OrbitSelect,
        OrbitConfirm,
        OrbitLeft,
        OrbitRight,
        OrbitUp,
        OrbitDown,
        LookHold1,
        LookHold2,
        LookZoomIn,
        LookZoomOut,
        AimHold,
        MapCircleUp,
        MapCircleDown,
        MapCircleLeft,
        MapCircleRight,
        MapMoveForward,
        MapMoveBack,
        MapMoveLeft,
        MapMoveRight,
        MapZoomIn,
        MapZoomOut,
        ChaseCamera,
        XrayVisor,
        ThermoVisor,
        InviroVisor,
        NoVisor,
        VisorMenu,
        VisorUp,
        VisorDown,
        UseSheild=0x3B,
        ScanItem=0x3C,
        UNKNOWN,
        None,
        MAX
    };

    enum class EFunctionList
    {
        None,
        LeftStickUp,
        LeftStickDown,
        LeftStickLeft,
        LeftStickRight,
        RightStickUp,
        RightStickDown,
        RightStickLeft,
        RightStickRight,
        LeftTrigger,
        RightTrigger,
        DPadUp,
        DPadDown,
        DPadLeft,
        DPadRight,
        AButton,
        BButton,
        XButton,
        YButton,
        ZButton,
        LeftTriggerPress,
        RightTriggerPress,
        Start,
        MAX // default case
    };

    static void SetCommandFiltered(ECommands cmd, bool filtered);
    static void ResetCommandFilters();
    static bool GetPressInput(ECommands cmd, const CFinalInput& input);
    static bool GetDigitalInput(ECommands cmd, const CFinalInput& input);
    static float GetAnalogInput(ECommands cmd, const CFinalInput& input);
    static const char* GetDescriptionForCommand(ECommands cmd);
    static const char* GetDescriptionForFunction(EFunctionList func);
};

}

#endif // __PSHAG_CCONTROLMAPPER_HPP__