namespace VRio.Core.Input;

/// <summary>
/// Gamepad button flags, bit-for-bit the XInput <c>wButtons</c> mask so the
/// App-side poller can cast the native value straight through.
/// </summary>
[Flags]
public enum PadButtons : ushort
{
    None = 0,
    DPadUp = 0x0001,
    DPadDown = 0x0002,
    DPadLeft = 0x0004,
    DPadRight = 0x0008,
    Start = 0x0010,
    Back = 0x0020,
    LeftThumb = 0x0040,
    RightThumb = 0x0080,
    LeftShoulder = 0x0100,
    RightShoulder = 0x0200,
    A = 0x1000,
    B = 0x2000,
    X = 0x4000,
    Y = 0x8000,
}

/// <summary>A gamepad analog control usable as a binding source.</summary>
public enum PadAxis
{
    LeftStickX,
    LeftStickY,
    RightStickX,
    RightStickY,
    LeftTrigger,
    RightTrigger,
}

/// <summary>
/// One normalized gamepad snapshot: sticks −1..+1 (up/right positive),
/// triggers 0..1. The default value is "pad at rest / no pad connected".
/// </summary>
public readonly struct PadState
{
    public PadState(PadButtons buttons,
        float leftStickX, float leftStickY, float rightStickX, float rightStickY,
        float leftTrigger, float rightTrigger)
    {
        Buttons = buttons;
        LeftStickX = leftStickX;
        LeftStickY = leftStickY;
        RightStickX = rightStickX;
        RightStickY = rightStickY;
        LeftTrigger = leftTrigger;
        RightTrigger = rightTrigger;
    }

    public PadButtons Buttons { get; }
    public float LeftStickX { get; }
    public float LeftStickY { get; }
    public float RightStickX { get; }
    public float RightStickY { get; }
    public float LeftTrigger { get; }
    public float RightTrigger { get; }

    /// <summary>Value of one analog control.</summary>
    public float Axis(PadAxis axis) => axis switch
    {
        PadAxis.LeftStickX => LeftStickX,
        PadAxis.LeftStickY => LeftStickY,
        PadAxis.RightStickX => RightStickX,
        PadAxis.RightStickY => RightStickY,
        PadAxis.LeftTrigger => LeftTrigger,
        PadAxis.RightTrigger => RightTrigger,
        _ => 0f,
    };
}
