using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace FLY.ControlLibrary.UI.OSK
{
    /// <summary>
    /// WdFullKeyboard.xaml 的交互逻辑
    /// </summary>
    /// <summary>
    /// WdFullKeyboard.xaml 的交互逻辑
    /// </summary>
    /// <summary>
    /// Window_FullPad.xaml 的交互逻辑
    /// </summary>
    public partial class WdFullKeyboard : Window, INotifyPropertyChanged, IVirtualKeyboard
    {
        private DispatcherTimer timer;
        private TextBox textbox = null;
        private bool press1st = true;
        public bool IsPwMode { get; set; } = false;
        FullKeyboardViewModel keyboard;
        /// <summary>
        /// 全键盘
        /// </summary>
        public WdFullKeyboard()
        {
            InitializeComponent();
            keyboard = new FullKeyboardViewModel();
            timer = new DispatcherTimer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = TimeSpan.FromMilliseconds(1);
        }

        void timer_Tick(object sender, EventArgs e)
        {
            timer.Stop();
            this.ShowDialog();

        }
        public void Open(TextBox textbox)
        {

            this.textbox = textbox;
            this.Result = textbox.Text;

            timer.Start();//不能直接showdialog(), 要让事件继续传递，直到有个框出来！！！

            //this.ShowDialog();
        }

        void updateResultView()
        {
            if (!IsPwMode)
            {
                this.ResultView = this.Result;
            }
            else
            {
                string star = "";
                for (int i = 0; i < this.Result.Length; i++)
                {
                    star += "*";
                }
                this.ResultView = star;
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = keyboard;
            this.textblock_result.DataContext = this;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {

            if (press1st)
            {
                press1st = false;
                Result = "";
            }

            string text = ((sender as Button).Content as TextBlock).Text;

            Result += text;
        }

        private void button_caps_Click(object sender, RoutedEventArgs e)
        {
            keyboard.IsCapsLock = !keyboard.IsCapsLock;
        }

        private void button_backspace_Click(object sender, RoutedEventArgs e)
        {
            Result = "";
        }

        private void button_close_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void button_123_Click(object sender, RoutedEventArgs e)
        {
            keyboard.Is123 = !keyboard.Is123;
        }

        private void button_space_Click(object sender, RoutedEventArgs e)
        {
            Result += " ";
        }

        private void button_enter_Click(object sender, RoutedEventArgs e)
        {
            if (this.textbox != null)
            {
                this.textbox.Text = Result;
                //触发失去焦点事件！！！！！！！
                //让 绑定的 property 生效
                this.textbox.RaiseEvent(new RoutedEventArgs(TextBox.LostFocusEvent));
            }
            this.Close();
        }


        private string result;
        /// <summary>
        /// 结果
        /// </summary>
        public string Result
        {
            get { return result; }
            set
            {
                if (result != value)
                {
                    result = value;
                    updateResultView();
                }
            }
        }
        /// <summary>
        /// 正常模式时， ResultView 与 Result 一样， 密码模式时， ResultView 显示*******
        /// </summary>
        public string ResultView { get; set; }

        /// <summary>
        /// 属性改变事件
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        private void Border_MouseDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }

        private void button_dot_Click(object sender, RoutedEventArgs e)
        {
            Result += keyboard.KeyDot;
        }


    }
    public class FullKeyboardViewModel : INotifyPropertyChanged
    {

        public string KeyQ { get; set; }


        public string KeyW { get; set; }

        public string KeyE { get; set; }


        public string KeyR { get; set; }

        public string KeyT { get; set; }

        public string KeyY { get; set; }

        public string KeyU { get; set; }

        public string KeyI { get; set; }

        public string KeyO { get; set; }

        public string KeyP { get; set; }

        public string KeyA { get; set; }

        public string KeyS { get; set; }

        public string KeyD { get; set; }

        public string KeyF { get; set; }

        public string KeyG { get; set; }

        public string KeyH { get; set; }

        public string KeyJ { get; set; }

        public string KeyK { get; set; }

        public string KeyL { get; set; }

        public string KeyZ { get; set; }

        public string KeyX { get; set; }

        public string KeyC { get; set; }

        public string KeyV { get; set; }

        public string KeyB { get; set; }

        public string KeyN { get; set; }

        public string KeyM { get; set; }


        public bool IsCapsLock { get; set; }

        public bool Is123 { get; set; }

        public string KeyDot { get; set; }

        static bool is123 = false;

        public FullKeyboardViewModel()
        {
            IsCapsLock = false;
            Is123 = is123;

            UpdateKey();

            this.PropertyChanged += new PropertyChangedEventHandler(FullKeyPad_PropertyChanged);
        }

        void FullKeyPad_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == nameof(Is123))
            {
                is123 = Is123;
                UpdateKey();
            }
            if (e.PropertyName == nameof(IsCapsLock))
            {
                UpdateKey();
            }
        }
        void UpdateKey()
        {
            if (Is123)
            {
                To123();
            }
            else
            {
                if (IsCapsLock)
                    ToUpper();
                else
                    ToLower();
            }
        }
        void To123()
        {
            KeyQ = "1";
            KeyW = "2";
            KeyE = "3";
            KeyR = "4";
            KeyT = "5";
            KeyY = "6";
            KeyU = "7";
            KeyI = "8";
            KeyO = "9";
            KeyP = "0";
            KeyA = "!";
            KeyS = "@";
            KeyD = "#";
            KeyF = "$";
            KeyG = "%";
            KeyH = "&";
            KeyJ = "*";
            KeyK = "(";
            KeyL = ")";
            KeyZ = "'";
            KeyX = "/";
            KeyC = "-";
            KeyV = "_";
            KeyB = ":";
            KeyN = ";";
            KeyM = "?";
            KeyDot = ".";
        }
        void ToUpper()
        {
            KeyQ = "Q";
            KeyW = "W";
            KeyE = "E";
            KeyR = "R";
            KeyT = "T";
            KeyY = "Y";
            KeyU = "U";
            KeyI = "I";
            KeyO = "O";
            KeyP = "P";
            KeyA = "A";
            KeyS = "S";
            KeyD = "D";
            KeyF = "F";
            KeyG = "G";
            KeyH = "H";
            KeyJ = "J";
            KeyK = "K";
            KeyL = "L";
            KeyZ = "Z";
            KeyX = "X";
            KeyC = "C";
            KeyV = "V";
            KeyB = "B";
            KeyN = "N";
            KeyM = "M";
            KeyDot = ",";
        }
        void ToLower()
        {
            KeyQ = "q";
            KeyW = "w";
            KeyE = "e";
            KeyR = "r";
            KeyT = "t";
            KeyY = "y";
            KeyU = "u";
            KeyI = "i";
            KeyO = "o";
            KeyP = "p";
            KeyA = "a";
            KeyS = "s";
            KeyD = "d";
            KeyF = "f";
            KeyG = "g";
            KeyH = "h";
            KeyJ = "j";
            KeyK = "k";
            KeyL = "l";
            KeyZ = "z";
            KeyX = "x";
            KeyC = "c";
            KeyV = "v";
            KeyB = "b";
            KeyN = "n";
            KeyM = "m";
            KeyDot = ",";
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

}
