using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace AxibugEmuOnline.Client.InputDevices
{
    public partial class KeyBoard : InputDevice
    {
        public override string UniqueName => nameof(KeyBoard);
        public override bool Online => true;

        public KeyBoard(InputResolver resolver) : base(resolver) { }

        protected override IEnumerable<KeyBase> DefineKeys()
        {
            var keys = s_keyboardKeys.Select(kc => new KeyboardKey(kc) as KeyBase);
            return keys;
        }

        public class KeyboardKey : KeyBase
        {
            internal KeyCode m_listenKey;

            public KeyboardKey(KeyCode listenKey)
            {
                m_listenKey = listenKey;
            }

            public override bool GetButtonDown()
            {
                return Input.GetKeyDown(m_listenKey);
            }

            public override bool GetButtonUp()
            {
                return Input.GetKeyUp(m_listenKey);
            }

            public override bool IsPressing()
            {
                return Input.GetKey(m_listenKey);
            }

            public override string KeyName => m_listenKey.ToString();
        }
    }

    #region HardCodeForKeyboard
    public partial class KeyBoard : InputDevice
    {
        static readonly List<KeyCode> s_keyboardKeys = new List<KeyCode>
        {
            // 字母键 A-Z
            KeyCode.A, KeyCode.B, KeyCode.C, KeyCode.D, KeyCode.E, KeyCode.F, KeyCode.G,
            KeyCode.H, KeyCode.I, KeyCode.J, KeyCode.K, KeyCode.L, KeyCode.M, KeyCode.N,
            KeyCode.O, KeyCode.P, KeyCode.Q, KeyCode.R, KeyCode.S, KeyCode.T, KeyCode.U,
            KeyCode.V, KeyCode.W, KeyCode.X, KeyCode.Y, KeyCode.Z,

            // 数字键 0-9
            KeyCode.Alpha0, KeyCode.Alpha1, KeyCode.Alpha2, KeyCode.Alpha3, KeyCode.Alpha4,
            KeyCode.Alpha5, KeyCode.Alpha6, KeyCode.Alpha7, KeyCode.Alpha8, KeyCode.Alpha9,

            // 功能键 F1-F15
            KeyCode.F1, KeyCode.F2, KeyCode.F3, KeyCode.F4, KeyCode.F5, KeyCode.F6,
            KeyCode.F7, KeyCode.F8, KeyCode.F9, KeyCode.F10, KeyCode.F11, KeyCode.F12,
            KeyCode.F13, KeyCode.F14, KeyCode.F15,

            // 方向键
            KeyCode.UpArrow, KeyCode.DownArrow, KeyCode.LeftArrow, KeyCode.RightArrow,

            // 控制键
            KeyCode.Space, KeyCode.Return, KeyCode.Escape, KeyCode.Tab, KeyCode.Backspace,
            KeyCode.CapsLock, KeyCode.LeftShift, KeyCode.RightShift, KeyCode.LeftControl,
            KeyCode.RightControl, KeyCode.LeftAlt, KeyCode.RightAlt, KeyCode.LeftCommand,
            KeyCode.RightCommand, KeyCode.Menu,

            // 符号键
            KeyCode.Comma, KeyCode.Period, KeyCode.Slash, KeyCode.BackQuote, KeyCode.Quote,
            KeyCode.Semicolon, KeyCode.LeftBracket, KeyCode.RightBracket, KeyCode.Backslash,
            KeyCode.Minus, KeyCode.Equals, KeyCode.Tilde,

            // 小键盘
            KeyCode.Keypad0, KeyCode.Keypad1, KeyCode.Keypad2, KeyCode.Keypad3, KeyCode.Keypad4,
            KeyCode.Keypad5, KeyCode.Keypad6, KeyCode.Keypad7, KeyCode.Keypad8, KeyCode.Keypad9,
            KeyCode.KeypadPeriod, KeyCode.KeypadDivide, KeyCode.KeypadMultiply,
            KeyCode.KeypadMinus, KeyCode.KeypadPlus, KeyCode.KeypadEnter, KeyCode.Numlock,

            // 其他标准键
            KeyCode.Print,  KeyCode.Insert, KeyCode.Delete, KeyCode.Home,
            KeyCode.End, KeyCode.PageUp, KeyCode.PageDown, KeyCode.Pause, KeyCode.ScrollLock,
            KeyCode.Clear
        };

        // 字母键 A-Z
        public KeyboardKey A { get; private set; } = new KeyboardKey(KeyCode.A);
        public KeyboardKey B { get; private set; } = new KeyboardKey(KeyCode.B);
        public KeyboardKey C { get; private set; } = new KeyboardKey(KeyCode.C);
        public KeyboardKey D { get; private set; } = new KeyboardKey(KeyCode.D);
        public KeyboardKey E { get; private set; } = new KeyboardKey(KeyCode.E);
        public KeyboardKey F { get; private set; } = new KeyboardKey(KeyCode.F);
        public KeyboardKey G { get; private set; } = new KeyboardKey(KeyCode.G);
        public KeyboardKey H { get; private set; } = new KeyboardKey(KeyCode.H);
        public KeyboardKey I { get; private set; } = new KeyboardKey(KeyCode.I);
        public KeyboardKey J { get; private set; } = new KeyboardKey(KeyCode.J);
        public KeyboardKey K { get; private set; } = new KeyboardKey(KeyCode.K);
        public KeyboardKey L { get; private set; } = new KeyboardKey(KeyCode.L);
        public KeyboardKey M { get; private set; } = new KeyboardKey(KeyCode.M);
        public KeyboardKey N { get; private set; } = new KeyboardKey(KeyCode.N);
        public KeyboardKey O { get; private set; } = new KeyboardKey(KeyCode.O);
        public KeyboardKey P { get; private set; } = new KeyboardKey(KeyCode.P);
        public KeyboardKey Q { get; private set; } = new KeyboardKey(KeyCode.Q);
        public KeyboardKey R { get; private set; } = new KeyboardKey(KeyCode.R);
        public KeyboardKey S { get; private set; } = new KeyboardKey(KeyCode.S);
        public KeyboardKey T { get; private set; } = new KeyboardKey(KeyCode.T);
        public KeyboardKey U { get; private set; } = new KeyboardKey(KeyCode.U);
        public KeyboardKey V { get; private set; } = new KeyboardKey(KeyCode.V);
        public KeyboardKey W { get; private set; } = new KeyboardKey(KeyCode.W);
        public KeyboardKey X { get; private set; } = new KeyboardKey(KeyCode.X);
        public KeyboardKey Y { get; private set; } = new KeyboardKey(KeyCode.Y);
        public KeyboardKey Z { get; private set; } = new KeyboardKey(KeyCode.Z);

        // 数字键 0-9
        public KeyboardKey Alpha0 { get; private set; } = new KeyboardKey(KeyCode.Alpha0);
        public KeyboardKey Alpha1 { get; private set; } = new KeyboardKey(KeyCode.Alpha1);
        public KeyboardKey Alpha2 { get; private set; } = new KeyboardKey(KeyCode.Alpha2);
        public KeyboardKey Alpha3 { get; private set; } = new KeyboardKey(KeyCode.Alpha3);
        public KeyboardKey Alpha4 { get; private set; } = new KeyboardKey(KeyCode.Alpha4);
        public KeyboardKey Alpha5 { get; private set; } = new KeyboardKey(KeyCode.Alpha5);
        public KeyboardKey Alpha6 { get; private set; } = new KeyboardKey(KeyCode.Alpha6);
        public KeyboardKey Alpha7 { get; private set; } = new KeyboardKey(KeyCode.Alpha7);
        public KeyboardKey Alpha8 { get; private set; } = new KeyboardKey(KeyCode.Alpha8);
        public KeyboardKey Alpha9 { get; private set; } = new KeyboardKey(KeyCode.Alpha9);

        // 功能键 F1-F15
        public KeyboardKey F1 { get; private set; } = new KeyboardKey(KeyCode.F1);
        public KeyboardKey F2 { get; private set; } = new KeyboardKey(KeyCode.F2);
        public KeyboardKey F3 { get; private set; } = new KeyboardKey(KeyCode.F3);
        public KeyboardKey F4 { get; private set; } = new KeyboardKey(KeyCode.F4);
        public KeyboardKey F5 { get; private set; } = new KeyboardKey(KeyCode.F5);
        public KeyboardKey F6 { get; private set; } = new KeyboardKey(KeyCode.F6);
        public KeyboardKey F7 { get; private set; } = new KeyboardKey(KeyCode.F7);
        public KeyboardKey F8 { get; private set; } = new KeyboardKey(KeyCode.F8);
        public KeyboardKey F9 { get; private set; } = new KeyboardKey(KeyCode.F9);
        public KeyboardKey F10 { get; private set; } = new KeyboardKey(KeyCode.F10);
        public KeyboardKey F11 { get; private set; } = new KeyboardKey(KeyCode.F11);
        public KeyboardKey F12 { get; private set; } = new KeyboardKey(KeyCode.F12);
        public KeyboardKey F13 { get; private set; } = new KeyboardKey(KeyCode.F13);
        public KeyboardKey F14 { get; private set; } = new KeyboardKey(KeyCode.F14);
        public KeyboardKey F15 { get; private set; } = new KeyboardKey(KeyCode.F15);

        // 方向键
        public KeyboardKey UpArrow { get; private set; } = new KeyboardKey(KeyCode.UpArrow);
        public KeyboardKey DownArrow { get; private set; } = new KeyboardKey(KeyCode.DownArrow);
        public KeyboardKey LeftArrow { get; private set; } = new KeyboardKey(KeyCode.LeftArrow);
        public KeyboardKey RightArrow { get; private set; } = new KeyboardKey(KeyCode.RightArrow);

        // 控制键
        public KeyboardKey Space { get; private set; } = new KeyboardKey(KeyCode.Space);
        public KeyboardKey Return { get; private set; } = new KeyboardKey(KeyCode.Return);
        public KeyboardKey Escape { get; private set; } = new KeyboardKey(KeyCode.Escape);
        public KeyboardKey Tab { get; private set; } = new KeyboardKey(KeyCode.Tab);
        public KeyboardKey Backspace { get; private set; } = new KeyboardKey(KeyCode.Backspace);
        public KeyboardKey CapsLock { get; private set; } = new KeyboardKey(KeyCode.CapsLock);
        public KeyboardKey LeftShift { get; private set; } = new KeyboardKey(KeyCode.LeftShift);
        public KeyboardKey RightShift { get; private set; } = new KeyboardKey(KeyCode.RightShift);
        public KeyboardKey LeftControl { get; private set; } = new KeyboardKey(KeyCode.LeftControl);
        public KeyboardKey RightControl { get; private set; } = new KeyboardKey(KeyCode.RightControl);
        public KeyboardKey LeftAlt { get; private set; } = new KeyboardKey(KeyCode.LeftAlt);
        public KeyboardKey RightAlt { get; private set; } = new KeyboardKey(KeyCode.RightAlt);
        public KeyboardKey LeftCommand { get; private set; } = new KeyboardKey(KeyCode.LeftCommand);
        public KeyboardKey RightCommand { get; private set; } = new KeyboardKey(KeyCode.RightCommand);
        public KeyboardKey Menu { get; private set; } = new KeyboardKey(KeyCode.Menu);

        // 符号键
        public KeyboardKey Comma { get; private set; } = new KeyboardKey(KeyCode.Comma);
        public KeyboardKey Period { get; private set; } = new KeyboardKey(KeyCode.Period);
        public KeyboardKey Slash { get; private set; } = new KeyboardKey(KeyCode.Slash);
        public KeyboardKey BackQuote { get; private set; } = new KeyboardKey(KeyCode.BackQuote);
        public KeyboardKey Quote { get; private set; } = new KeyboardKey(KeyCode.Quote);
        public KeyboardKey Semicolon { get; private set; } = new KeyboardKey(KeyCode.Semicolon);
        public KeyboardKey LeftBracket { get; private set; } = new KeyboardKey(KeyCode.LeftBracket);
        public KeyboardKey RightBracket { get; private set; } = new KeyboardKey(KeyCode.RightBracket);
        public KeyboardKey Backslash { get; private set; } = new KeyboardKey(KeyCode.Backslash);
        public KeyboardKey Minus { get; private set; } = new KeyboardKey(KeyCode.Minus);
        public KeyboardKey Equals_k { get; private set; } = new KeyboardKey(KeyCode.Equals);
        public KeyboardKey Tilde { get; private set; } = new KeyboardKey(KeyCode.Tilde);

        // 小键盘
        public KeyboardKey Keypad0 { get; private set; } = new KeyboardKey(KeyCode.Keypad0);
        public KeyboardKey Keypad1 { get; private set; } = new KeyboardKey(KeyCode.Keypad1);
        public KeyboardKey Keypad2 { get; private set; } = new KeyboardKey(KeyCode.Keypad2);
        public KeyboardKey Keypad3 { get; private set; } = new KeyboardKey(KeyCode.Keypad3);
        public KeyboardKey Keypad4 { get; private set; } = new KeyboardKey(KeyCode.Keypad4);
        public KeyboardKey Keypad5 { get; private set; } = new KeyboardKey(KeyCode.Keypad5);
        public KeyboardKey Keypad6 { get; private set; } = new KeyboardKey(KeyCode.Keypad6);
        public KeyboardKey Keypad7 { get; private set; } = new KeyboardKey(KeyCode.Keypad7);
        public KeyboardKey Keypad8 { get; private set; } = new KeyboardKey(KeyCode.Keypad8);
        public KeyboardKey Keypad9 { get; private set; } = new KeyboardKey(KeyCode.Keypad9);
        public KeyboardKey KeypadPeriod { get; private set; } = new KeyboardKey(KeyCode.KeypadPeriod);
        public KeyboardKey KeypadDivide { get; private set; } = new KeyboardKey(KeyCode.KeypadDivide);
        public KeyboardKey KeypadMultiply { get; private set; } = new KeyboardKey(KeyCode.KeypadMultiply);
        public KeyboardKey KeypadMinus { get; private set; } = new KeyboardKey(KeyCode.KeypadMinus);
        public KeyboardKey KeypadPlus { get; private set; } = new KeyboardKey(KeyCode.KeypadPlus);
        public KeyboardKey KeypadEnter { get; private set; } = new KeyboardKey(KeyCode.KeypadEnter);
        public KeyboardKey Numlock { get; private set; } = new KeyboardKey(KeyCode.Numlock);

        // 其他标准键
        public KeyboardKey Print { get; private set; } = new KeyboardKey(KeyCode.Print);
        public KeyboardKey Insert { get; private set; } = new KeyboardKey(KeyCode.Insert);
        public KeyboardKey Delete { get; private set; } = new KeyboardKey(KeyCode.Delete);
        public KeyboardKey Home { get; private set; } = new KeyboardKey(KeyCode.Home);
        public KeyboardKey End { get; private set; } = new KeyboardKey(KeyCode.End);
        public KeyboardKey PageUp { get; private set; } = new KeyboardKey(KeyCode.PageUp);
        public KeyboardKey PageDown { get; private set; } = new KeyboardKey(KeyCode.PageDown);
        public KeyboardKey Pause { get; private set; } = new KeyboardKey(KeyCode.Pause);
        public KeyboardKey ScrollLock { get; private set; } = new KeyboardKey(KeyCode.ScrollLock);
        public KeyboardKey Clear { get; private set; } = new KeyboardKey(KeyCode.Clear);
    }
    #endregion
}