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

namespace AxibugEmuOnline.Client.InputDevices
{
    /// <summary>
    /// 通用键盘设备
    /// </summary>
    public partial class KeyBoard : InputDevice
    {
        Dictionary<KeyCode, KeyboardKey> m_keyControllerMap = new Dictionary<KeyCode, KeyboardKey>();

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

        protected override IEnumerable<InputControl> DefineControls()
        {
            var keys = s_keyboardKeys.Select(kc => new KeyboardKey(kc, this) as InputControl);
            foreach (KeyboardKey key in keys)
            {
                m_keyControllerMap[key.m_keycode] = key;
            }
            return keys;
        }

        public class KeyboardKey : InputControl
        {
            internal KeyCode m_keycode;

            public override bool Start => Device.Resolver.GetKeyDown(Device as KeyBoard, m_keycode);
            public override bool Release => Device.Resolver.GetKeyUp(Device as KeyBoard, m_keycode);
            public override bool Performing => Device.Resolver.GetKey(Device as KeyBoard, m_keycode);

            internal KeyboardKey(KeyCode listenKey, KeyBoard keyboard)
                : base(keyboard)
            {
                m_keycode = listenKey;
            }

            public override string ControlName => m_keycode.ToString();

            public override Vector2 GetVector2()
            {
                return default(Vector2);
            }

            public override float GetFlaot()
            {
                return Performing ? 1 : 0;
            }
        }
    }

    #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
        };

        public KeyboardKey A => m_keyControllerMap[KeyCode.A];
        public KeyboardKey B => m_keyControllerMap[KeyCode.B];
        public KeyboardKey C => m_keyControllerMap[KeyCode.C];
        public KeyboardKey D => m_keyControllerMap[KeyCode.D];
        public KeyboardKey E => m_keyControllerMap[KeyCode.E];
        public KeyboardKey F => m_keyControllerMap[KeyCode.F];
        public KeyboardKey G => m_keyControllerMap[KeyCode.G];
        public KeyboardKey H => m_keyControllerMap[KeyCode.H];
        public KeyboardKey I => m_keyControllerMap[KeyCode.I];
        public KeyboardKey J => m_keyControllerMap[KeyCode.J];
        public KeyboardKey K => m_keyControllerMap[KeyCode.K];
        public KeyboardKey L => m_keyControllerMap[KeyCode.L];
        public KeyboardKey M => m_keyControllerMap[KeyCode.M];
        public KeyboardKey N => m_keyControllerMap[KeyCode.N];
        public KeyboardKey O => m_keyControllerMap[KeyCode.O];
        public KeyboardKey P => m_keyControllerMap[KeyCode.P];
        public KeyboardKey Q => m_keyControllerMap[KeyCode.Q];
        public KeyboardKey R => m_keyControllerMap[KeyCode.R];
        public KeyboardKey S => m_keyControllerMap[KeyCode.S];
        public KeyboardKey T => m_keyControllerMap[KeyCode.T];
        public KeyboardKey U => m_keyControllerMap[KeyCode.U];
        public KeyboardKey V => m_keyControllerMap[KeyCode.V];
        public KeyboardKey W => m_keyControllerMap[KeyCode.W];
        public KeyboardKey X => m_keyControllerMap[KeyCode.X];
        public KeyboardKey Y => m_keyControllerMap[KeyCode.Y];
        public KeyboardKey Z => m_keyControllerMap[KeyCode.Z];
        public KeyboardKey Alpha0 => m_keyControllerMap[KeyCode.Alpha0];
        public KeyboardKey Alpha1 => m_keyControllerMap[KeyCode.Alpha1];
        public KeyboardKey Alpha2 => m_keyControllerMap[KeyCode.Alpha2];
        public KeyboardKey Alpha3 => m_keyControllerMap[KeyCode.Alpha3];
        public KeyboardKey Alpha4 => m_keyControllerMap[KeyCode.Alpha4];
        public KeyboardKey Alpha5 => m_keyControllerMap[KeyCode.Alpha5];
        public KeyboardKey Alpha6 => m_keyControllerMap[KeyCode.Alpha6];
        public KeyboardKey Alpha7 => m_keyControllerMap[KeyCode.Alpha7];
        public KeyboardKey Alpha8 => m_keyControllerMap[KeyCode.Alpha8];
        public KeyboardKey Alpha9 => m_keyControllerMap[KeyCode.Alpha9];
        public KeyboardKey F1 => m_keyControllerMap[KeyCode.F1];
        public KeyboardKey F2 => m_keyControllerMap[KeyCode.F2];
        public KeyboardKey F3 => m_keyControllerMap[KeyCode.F3];
        public KeyboardKey F4 => m_keyControllerMap[KeyCode.F4];
        public KeyboardKey F5 => m_keyControllerMap[KeyCode.F5];
        public KeyboardKey F6 => m_keyControllerMap[KeyCode.F6];
        public KeyboardKey F7 => m_keyControllerMap[KeyCode.F7];
        public KeyboardKey F8 => m_keyControllerMap[KeyCode.F8];
        public KeyboardKey F9 => m_keyControllerMap[KeyCode.F9];
        public KeyboardKey F10 => m_keyControllerMap[KeyCode.F10];
        public KeyboardKey F11 => m_keyControllerMap[KeyCode.F11];
        public KeyboardKey F12 => m_keyControllerMap[KeyCode.F12];
        public KeyboardKey F13 => m_keyControllerMap[KeyCode.F13];
        public KeyboardKey F14 => m_keyControllerMap[KeyCode.F14];
        public KeyboardKey F15 => m_keyControllerMap[KeyCode.F15];
        public KeyboardKey UpArrow => m_keyControllerMap[KeyCode.UpArrow];
        public KeyboardKey DownArrow => m_keyControllerMap[KeyCode.DownArrow];
        public KeyboardKey LeftArrow => m_keyControllerMap[KeyCode.LeftArrow];
        public KeyboardKey RightArrow => m_keyControllerMap[KeyCode.RightArrow];
        public KeyboardKey Space => m_keyControllerMap[KeyCode.Space];
        public KeyboardKey Return => m_keyControllerMap[KeyCode.Return];
        public KeyboardKey Escape => m_keyControllerMap[KeyCode.Escape];
        public KeyboardKey Tab => m_keyControllerMap[KeyCode.Tab];
        public KeyboardKey Backspace => m_keyControllerMap[KeyCode.Backspace];
        public KeyboardKey CapsLock => m_keyControllerMap[KeyCode.CapsLock];
        public KeyboardKey LeftShift => m_keyControllerMap[KeyCode.LeftShift];
        public KeyboardKey RightShift => m_keyControllerMap[KeyCode.RightShift];
        public KeyboardKey LeftControl => m_keyControllerMap[KeyCode.LeftControl];
        public KeyboardKey RightControl => m_keyControllerMap[KeyCode.RightControl];
        public KeyboardKey LeftAlt => m_keyControllerMap[KeyCode.LeftAlt];
        public KeyboardKey RightAlt => m_keyControllerMap[KeyCode.RightAlt];
        public KeyboardKey LeftCommand => m_keyControllerMap[KeyCode.LeftCommand];
        public KeyboardKey RightCommand => m_keyControllerMap[KeyCode.RightCommand];
        public KeyboardKey Menu => m_keyControllerMap[KeyCode.Menu];
        public KeyboardKey Comma => m_keyControllerMap[KeyCode.Comma];
        public KeyboardKey Period => m_keyControllerMap[KeyCode.Period];
        public KeyboardKey Slash => m_keyControllerMap[KeyCode.Slash];
        public KeyboardKey BackQuote => m_keyControllerMap[KeyCode.BackQuote];
        public KeyboardKey Quote => m_keyControllerMap[KeyCode.Quote];
        public KeyboardKey Semicolon => m_keyControllerMap[KeyCode.Semicolon];
        public KeyboardKey LeftBracket => m_keyControllerMap[KeyCode.LeftBracket];
        public KeyboardKey RightBracket => m_keyControllerMap[KeyCode.RightBracket];
        public KeyboardKey Backslash => m_keyControllerMap[KeyCode.Backslash];
        public KeyboardKey Minus => m_keyControllerMap[KeyCode.Minus];
        public KeyboardKey Equals_k => m_keyControllerMap[KeyCode.Equals];
        public KeyboardKey Tilde => m_keyControllerMap[KeyCode.Tilde];
        public KeyboardKey Keypad0 => m_keyControllerMap[KeyCode.Keypad0];
        public KeyboardKey Keypad1 => m_keyControllerMap[KeyCode.Keypad1];
        public KeyboardKey Keypad2 => m_keyControllerMap[KeyCode.Keypad2];
        public KeyboardKey Keypad3 => m_keyControllerMap[KeyCode.Keypad3];
        public KeyboardKey Keypad4 => m_keyControllerMap[KeyCode.Keypad4];
        public KeyboardKey Keypad5 => m_keyControllerMap[KeyCode.Keypad5];
        public KeyboardKey Keypad6 => m_keyControllerMap[KeyCode.Keypad6];
        public KeyboardKey Keypad7 => m_keyControllerMap[KeyCode.Keypad7];
        public KeyboardKey Keypad8 => m_keyControllerMap[KeyCode.Keypad8];
        public KeyboardKey Keypad9 => m_keyControllerMap[KeyCode.Keypad9];
        public KeyboardKey KeypadPeriod => m_keyControllerMap[KeyCode.KeypadPeriod];
        public KeyboardKey KeypadDivide => m_keyControllerMap[KeyCode.KeypadDivide];
        public KeyboardKey KeypadMultiply => m_keyControllerMap[KeyCode.KeypadMultiply];
        public KeyboardKey KeypadMinus => m_keyControllerMap[KeyCode.KeypadMinus];
        public KeyboardKey KeypadPlus => m_keyControllerMap[KeyCode.KeypadPlus];
        public KeyboardKey KeypadEnter => m_keyControllerMap[KeyCode.KeypadEnter];
        public KeyboardKey Numlock => m_keyControllerMap[KeyCode.Numlock];
        public KeyboardKey Print => m_keyControllerMap[KeyCode.Print];
        public KeyboardKey Insert => m_keyControllerMap[KeyCode.Insert];
        public KeyboardKey Delete => m_keyControllerMap[KeyCode.Delete];
        public KeyboardKey Home => m_keyControllerMap[KeyCode.Home];
        public KeyboardKey End => m_keyControllerMap[KeyCode.End];
        public KeyboardKey PageUp => m_keyControllerMap[KeyCode.PageUp];
        public KeyboardKey PageDown => m_keyControllerMap[KeyCode.PageDown];
        public KeyboardKey Pause => m_keyControllerMap[KeyCode.Pause];
        public KeyboardKey ScrollLock => m_keyControllerMap[KeyCode.ScrollLock];
        public KeyboardKey Clear => m_keyControllerMap[KeyCode.Clear];
    }
    #endregion
}