#ifndef XNA_ENUMS_HPP
#define XNA_ENUMS_HPP

namespace xna {
    enum  class AudioReverb {
        Off,
        Default,
        Generic,
        Forest,
        PaddedCell,
        Room,
        Bathroom,
        LivingRoom,
        StoneRoom,
        Auditorium,
        ConcertHall,
        Cave,
        Arena,
        Hangar,
        CarpetedHallway,
        Hallway,
        StoneCorridor,
        Alley,
        City,
        Mountains,
        Quarry,
        Plain,
        ParkingLot,
        SewerPipe,
        Underwater,
        SmallRoom,
        MediumRoom,
        LargeRoom,
        MediumHall,
        LargeHall,
        Plate,
        Max
    };

	enum class Blend {
		Zero,
		One,
		SourceColor,
		InverseSourceColor,
		SourceAlpha,
		InverseSourceAlpha,
		DestinationAlpha,
		InverseDestinationAlpha,
		DestinationColor,
		InverseDestinationColor,
		SourceAlphaSaturation,
		BlendFactor,
		InverseBlendFactor,
		Source1Color,
		InverseSource1Color,
		Source1Alpha,
		InverseSource1Alpha
	};	

	enum class BlendFunction {
		Add = 0,
		Subtract = 1,
		ReverseSubtract = 2,
		Min = 3,
		Max = 4,
	};

	using BlendOperation = BlendFunction;

    enum class BufferUsage {
        Default,
        Immutable,
        Dynamic,
        Static,
    };

    enum class Buttons {
        A = 4096, // 0x00001000
        B = 8192, // 0x00002000
        X = 16384, // 0x00004000
        Y = 32768, // 0x00008000
        Back = 32, // 0x00000020
        Start = 16, // 0x00000010
        DPadUp = 1,
        DPadDown = 2,
        DPadLeft = 4,
        DPadRight = 8,
        LeftShoulder = 256, // 0x00000100
        RightShoulder = 512, // 0x00000200
        LeftStick = 64, // 0x00000040
        RightStick = 128, // 0x00000080
        BigButton = 2048, // 0x00000800
        LeftThumbstickLeft = 2097152, // 0x00200000
        LeftThumbstickRight = 1073741824, // 0x40000000
        LeftThumbstickDown = 536870912, // 0x20000000
        LeftThumbstickUp = 268435456, // 0x10000000
        RightThumbstickLeft = 134217728, // 0x08000000
        RightThumbstickRight = 67108864, // 0x04000000
        RightThumbstickDown = 33554432, // 0x02000000
        RightThumbstickUp = 16777216, // 0x01000000
        LeftTrigger = 8388608, // 0x00800000
        RightTrigger = 4194304, // 0x00400000
    };

    enum class ButtonState
    {
        Released,
        Pressed,
    };

	enum class ColorWriteChannels {
		Red,
		Green,
		Blue,
		Alpha,
		All
	};    

    enum class ContainmentType {
        Disjoint,
        Contains,
        Intersects,
    };

	enum class ComparisonFunction {
		Never,
		Less,
		Equal,
		LessEquals,
		Greater,
		NotEqual,
		GreaterEqual,
		Always
	};

	enum class CullMode {
		None,
		CullClockwiseFace,
		CullCounterClockwiseFace,
	};

	enum class DepthFormat {
		None,
		Depth16,
		Depth24,
		Depth24Stencil8
	};

	enum class DepthWriteMask {
		Zero,
		All
	};

	enum class DisplayOrientation {
		Default = 0,
		LandscapeLeft = 1,
		LandscapeRight = 2,
		Portrait = 4,
	};

    enum class DisplayModeScanlineOrder {
        Unspecified = 0,
        Progressive = 1,
        UpperFieldFirst = 2,
        LowerFieldFirst = 3
    };

    enum class DisplayModeScaling {
        Unspecified = 0,
        Centered = 1,
        Stretched = 2
    };

    enum class FileMode {
        CreateNew,
        Create,
        Append,
        Open,
        OpenOrCreate,
        Truncate
    };

	enum class FillMode
	{		
		WireFrame,
        Solid,
	};

    enum class GameComponentType {
        Updatable,
        Drawable,
    };

    enum class GamePadCapabilitiesType
    {
        Unknown = 0,
        Gamepad,
        Wheel,
        ArdaceStick,
        FlightStick,
        DancePAd,
        Guitar,
        GuitarAlternate,
        DrumKit,
        GuitarBass = 11,
        ArcadePad = 19,
    };

    enum class GamePadDeadZone {
        IndependentAxes,
        Circular,
        None,
    };

	enum class GraphicsProfile {
		Reach,
		HiDef
	};

    enum class Keys {
        None = 0,
        Back = 8,
        Tab = 9,
        Enter = 13, // 0x0000000D
        Pause = 19, // 0x00000013
        CapsLock = 20, // 0x00000014
        Kana = 21, // 0x00000015
        Kanji = 25, // 0x00000019
        Escape = 27, // 0x0000001B
        ImeConvert = 28, // 0x0000001C
        ImeNoConvert = 29, // 0x0000001D
        Space = 32, // 0x00000020
        PageUp = 33, // 0x00000021
        PageDown = 34, // 0x00000022
        End = 35, // 0x00000023
        Home = 36, // 0x00000024
        Left = 37, // 0x00000025
        Up = 38, // 0x00000026
        Right = 39, // 0x00000027
        Down = 40, // 0x00000028
        Select = 41, // 0x00000029
        Print = 42, // 0x0000002A
        Execute = 43, // 0x0000002B
        PrintScreen = 44, // 0x0000002C
        Insert = 45, // 0x0000002D
        Delete = 46, // 0x0000002E
        Help = 47, // 0x0000002F
        D0 = 48, // 0x00000030
        D1 = 49, // 0x00000031
        D2 = 50, // 0x00000032
        D3 = 51, // 0x00000033
        D4 = 52, // 0x00000034
        D5 = 53, // 0x00000035
        D6 = 54, // 0x00000036
        D7 = 55, // 0x00000037
        D8 = 56, // 0x00000038
        D9 = 57, // 0x00000039
        A = 65, // 0x00000041
        B = 66, // 0x00000042
        C = 67, // 0x00000043
        D = 68, // 0x00000044
        E = 69, // 0x00000045
        F = 70, // 0x00000046
        G = 71, // 0x00000047
        H = 72, // 0x00000048
        I = 73, // 0x00000049
        J = 74, // 0x0000004A
        K = 75, // 0x0000004B
        L = 76, // 0x0000004C
        M = 77, // 0x0000004D
        N = 78, // 0x0000004E
        O = 79, // 0x0000004F
        P = 80, // 0x00000050
        Q = 81, // 0x00000051
        R = 82, // 0x00000052
        S = 83, // 0x00000053
        T = 84, // 0x00000054
        U = 85, // 0x00000055
        V = 86, // 0x00000056
        W = 87, // 0x00000057
        X = 88, // 0x00000058
        Y = 89, // 0x00000059
        Z = 90, // 0x0000005A
        LeftWindows = 91, // 0x0000005B
        RightWindows = 92, // 0x0000005C
        Apps = 93, // 0x0000005D
        Sleep = 95, // 0x0000005F
        NumPad0 = 96, // 0x00000060
        NumPad1 = 97, // 0x00000061
        NumPad2 = 98, // 0x00000062
        NumPad3 = 99, // 0x00000063
        NumPad4 = 100, // 0x00000064
        NumPad5 = 101, // 0x00000065
        NumPad6 = 102, // 0x00000066
        NumPad7 = 103, // 0x00000067
        NumPad8 = 104, // 0x00000068
        NumPad9 = 105, // 0x00000069
        Multiply = 106, // 0x0000006A
        Add = 107, // 0x0000006B
        Separator = 108, // 0x0000006C
        Subtract = 109, // 0x0000006D
        Decimal = 110, // 0x0000006E
        Divide = 111, // 0x0000006F
        F1 = 112, // 0x00000070
        F2 = 113, // 0x00000071
        F3 = 114, // 0x00000072
        F4 = 115, // 0x00000073
        F5 = 116, // 0x00000074
        F6 = 117, // 0x00000075
        F7 = 118, // 0x00000076
        F8 = 119, // 0x00000077
        F9 = 120, // 0x00000078
        F10 = 121, // 0x00000079
        F11 = 122, // 0x0000007A
        F12 = 123, // 0x0000007B
        F13 = 124, // 0x0000007C
        F14 = 125, // 0x0000007D
        F15 = 126, // 0x0000007E
        F16 = 127, // 0x0000007F
        F17 = 128, // 0x00000080
        F18 = 129, // 0x00000081
        F19 = 130, // 0x00000082
        F20 = 131, // 0x00000083
        F21 = 132, // 0x00000084
        F22 = 133, // 0x00000085
        F23 = 134, // 0x00000086
        F24 = 135, // 0x00000087
        NumLock = 144, // 0x00000090
        Scroll = 145, // 0x00000091
        LeftShift = 160, // 0x000000A0
        RightShift = 161, // 0x000000A1
        LeftControl = 162, // 0x000000A2
        RightControl = 163, // 0x000000A3
        LeftAlt = 164, // 0x000000A4
        RightAlt = 165, // 0x000000A5
        BrowserBack = 166, // 0x000000A6
        BrowserForward = 167, // 0x000000A7
        BrowserRefresh = 168, // 0x000000A8
        BrowserStop = 169, // 0x000000A9
        BrowserSearch = 170, // 0x000000AA
        BrowserFavorites = 171, // 0x000000AB
        BrowserHome = 172, // 0x000000AC
        VolumeMute = 173, // 0x000000AD
        VolumeDown = 174, // 0x000000AE
        VolumeUp = 175, // 0x000000AF
        MediaNextTrack = 176, // 0x000000B0
        MediaPreviousTrack = 177, // 0x000000B1
        MediaStop = 178, // 0x000000B2
        MediaPlayPause = 179, // 0x000000B3
        LaunchMail = 180, // 0x000000B4
        SelectMedia = 181, // 0x000000B5
        LaunchApplication1 = 182, // 0x000000B6
        LaunchApplication2 = 183, // 0x000000B7
        OemSemicolon = 186, // 0x000000BA
        OemPlus = 187, // 0x000000BB
        OemComma = 188, // 0x000000BC
        OemMinus = 189, // 0x000000BD
        OemPeriod = 190, // 0x000000BE
        OemQuestion = 191, // 0x000000BF
        OemTilde = 192, // 0x000000C0
        ChatPadGreen = 202, // 0x000000CA
        ChatPadOrange = 203, // 0x000000CB
        OemOpenBrackets = 219, // 0x000000DB
        OemPipe = 220, // 0x000000DC
        OemCloseBrackets = 221, // 0x000000DD
        OemQuotes = 222, // 0x000000DE
        Oem8 = 223, // 0x000000DF
        OemBackslash = 226, // 0x000000E2
        ProcessKey = 229, // 0x000000E5
        OemCopy = 242, // 0x000000F2
        OemAuto = 243, // 0x000000F3
        OemEnlW = 244, // 0x000000F4
        Attn = 246, // 0x000000F6
        Crsel = 247, // 0x000000F7
        Exsel = 248, // 0x000000F8
        EraseEof = 249, // 0x000000F9
        Play = 250, // 0x000000FA
        Zoom = 251, // 0x000000FB
        Pa1 = 253, // 0x000000FD
        OemClear = 254, // 0x000000FE
    };

    enum class KeyState {
        Up,
        Down,
    };

    enum class PlaneIntersectionType {
        Front,
        Back,
        Intersecting,
    };

    enum class PlayerIndex
    {
        One,
        Two,
        Three,
        Four,
    };

	enum class PresentInterval {
		Default,
		One,
		Two,
		Immediate
	};

	enum RenderTargetUsage {
		DiscardContents,
		PreserveContents,
		PlatformContents
	};

	enum class SeekOrigin {
		Begin,
		Current,
		End,
	};

	enum class SpriteEffects {
		None = 0,
		FlipHorizontally = 1,
		FlipVertically = 2,
		Both = FlipHorizontally | FlipVertically
	};

	enum class SpriteSortMode
	{
		Deferred,
		Immediate,
		Texture,
		BackToFront,
		FrontToBack,
	};

	enum class StencilOperation
	{
		Keep,
		Zero,
		Replace,
		IncrementSaturation,
		DecrementSaturation,
		Invert,
		Increment,
		Decrement,
	};

	enum class SurfaceFormat {
		Color = 0,
		Bgr565 = 1,
		Bgra5551 = 2,
		Bgra4444 = 3,
		Dxt1 = 4,
		Dxt3 = 5,
		Dxt5 = 6,
		NormalizedByte2 = 7,
		NormalizedByte4 = 8,
		Rgba1010102 = 9,
		Rg32 = 10,
		Rgba64 = 11,
		Alpha8 = 12,
		Single = 13,
		Vector2 = 14,
		Vector4 = 15,
		HalfSingle = 16,
		HalfVector2 = 17,
		HalfVector4 = 18,
		HdrBlendable = 19,
        Unknown,
	};

    enum class SwapEffect {
        Discard,
        Sequential,
        FlipSequential,
        FlipDiscard
    };

	enum class TextureAddressMode {
		Wrap,
		Mirror,
		Clamp,
		Border,
		MirrorOnce
	};

	enum class TextureFilter {
		Linear,
		Point,
		Anisotropic,
		LinearMipPoint,
		PointMipLinear,
		MinLinearMagPointMipLinear,
		MinLinearMagPointMipPoint,
		MinPointMagLinearMipLinear,
		MinPointMagLinearMipPoint,
	};



	constexpr int SURFACE_FORMAT_COUNT = 19;
}

#endif