using HKCardManager.UserPages;
using HKLib.Dto;
using HKLib.Interfaces;
using HKLib.SQLHelper;
using System.Text.RegularExpressions;
using HKHelper;
using UHFHelper;

namespace HKCardManager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DbContext.InitTable();
            splitContainer1.SplitterDistance = 240;
            DataGridViewInit();
            ShowPage(new PersonnelEntryPage());
            Task.Factory.StartNew(() =>
            {
                var res = UHFCardHelper.GetInstance().OpenPort();
                if (res != null && res.Res)
                    MessageLogNotify.GetInstance.Show("制卡设备已连接！");
                else MessageLogNotify.GetInstance.ShowError($"制卡设备未连接！");
            });
            this.SizeChanged += Form1_SizeChanged;
            this.button1.SizeChanged += Button1_SizeChanged;
            this.splitContainer2.SplitterMoved += SplitContainer1_SizeChanged;
            MessageLogNotify.GetInstance.Info = new Action<string, Color>((s, br) =>
             {
                 this.Invoke(() =>
                 {
                     dataGridView1.Rows.Insert(0, new string[] { "", $"{DateTime.Now.ToString("HH:mm:ss")} {s}" });
                     dataGridView1.Rows[0].DefaultCellStyle.ForeColor = br;
                     dataGridView1.Rows[0].DefaultCellStyle.Padding = new Padding(0, 0, 0, 10);
                 });
             });
        }

        private void SplitContainer1_SizeChanged(object? sender, EventArgs e)
        {
            if (tempUserControl != null)
            {
                tempUserControl.Width = this.panel1.Width;
                tempUserControl.Height = this.panel1.Height;
            }
        }

        private void DataGridViewInit()
        {
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            dataGridView1.AutoGenerateColumns = false;//禁止自动添加列
            dataGridView1.AllowUserToResizeColumns = false;//是否可以调整列的大小
            dataGridView1.AllowUserToResizeRows = false;//是否可以调整行的大小
            dataGridView1.BorderStyle = BorderStyle.None;//DataGridView边框样式
            dataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
            dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
            dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
            dataGridView1.SelectionChanged += DataGridView1_SelectionChanged;

        }

        private void DataGridView1_SelectionChanged(object? sender, EventArgs e)
        {
            dataGridView1.ClearSelection();//禁止选择行
        }

        private void Write(string msg)
        {
            //bool条件默认为配置文件里面定义,可以自定义任何保存数据条件
            //bool temp = Convert.ToBoolean(iniFile.IniReadValue("设置", "保存运行信息", AppDomain.CurrentDomain.BaseDirectory + "设置.ini"));
            //if (temp)
            //{
            //    string logPath = Path.GetDirectoryName(Application.ExecutablePath);
            //    //  System.IO.StreamWriter sw = System.IO.File.AppendText(logPath + "/" + DateTime.Now.ToString("yyMMdd") + ".txt");
            //    System.IO.StreamWriter sw = System.IO.File.AppendText(logPath + "\\log\\" + DateTime.Now.ToString("yyMMdd") + ".txt");

            //    sw.WriteLine(DateTime.Now.ToString("HH:mm:ss  ") + msg);
            //    sw.Close();
            //    sw.Dispose();
            //}
        }

        private void AddListToListBox(ListBox rtbox, string text, Brush foreColor, bool addTime = true)
        {
            rtbox.DrawMode = DrawMode.OwnerDrawVariable;
            rtbox.Font = new Font("楷体", 12);
            if (rtbox.ItemHeight != 24)
            {
                rtbox.ItemHeight = 1;
                rtbox.DrawItem += ((sender, e) => //控件重绘事件
                {
                    if (e.Index == -1) return;
                    e.DrawBackground();
                    ListBoxItem item = (ListBoxItem)rtbox.Items[e.Index];
                    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                    {
                        e.DrawFocusRectangle();
                        Brush b = Brushes.Khaki;//设置选中项颜色
                        e.Graphics.FillRectangle(b, e.Bounds);
                    }
                    if (item != null)
                    {
                        Brush brush = item.ForeColor;
                        Rectangle r = e.Bounds;
                        r.Height = e.Bounds.Height;
                        r.Width = e.Bounds.Width + 100;

                        e.Graphics.DrawString(item.Text, e.Font, brush, r, StringFormat.GenericDefault);
                    }
                    else
                    {
                        e.Graphics.DrawString(item.Text, e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
                    }
                });
            }


            rtbox.ItemHeight = 25;//设置单行高度
            if (rtbox.InvokeRequired)
            {
                rtbox.Invoke(new Action<ListBox, string, Brush, bool>((rtb, str, color, addtime) => AddListToListBox(rtb, str, color, addtime)), rtbox, text, foreColor, addTime);
                return;
            }

            //text = string.Format("{0}-{1}", rtbox.Items.Count.ToString("000"), text);

            if (addTime)
            {
                //text = string.Format("[{0}]:{1}", DateTime.Now.ToString("HH:mm:ss"), text);
                text = $"{DateTime.Now.ToString("HH:mm:ss")}：{text}";
            }

            if (rtbox.Items.Count > 0)
                rtbox.Items.Insert(0, new ListBoxItem(text, foreColor));
            else
                rtbox.Items.Add(new ListBoxItem(text, foreColor));

            try
            {
                Write(text);

            }
            catch { }

            //清除过多的数据
            if (rtbox.Items.Count > 100)
            {
                int count = rtbox.Items.Count - 100;
                List<object> temp = new List<object>();
                for (int i = 100; i < rtbox.Items.Count; i++)
                {
                    if (rtbox.Items.Count >= i - 1) temp.Add(rtbox.Items[i]);
                }
                foreach (object obj in temp)
                {
                    rtbox.Items.Remove(obj);
                }
            }
            //rtbox.SelectedIndex = rtbox.Items.Count - 1;
            //if (rtbox.Items.Count > 100)
            //{
            //    int count = rtbox.Items.Count - 100;

            //    List<object> temp = new List<object>();

            //    for (int i = 0; i < count; i++)
            //    {
            //        temp.Add(rtbox.Items[i]);
            //    }

            //    foreach (object obj in temp)
            //    {
            //        rtbox.Items.Remove(obj);
            //    }
            //}
            //rtbox.SelectedIndex = rtbox.Items.Count - 1;
        }

        private void Button1_SizeChanged(object? sender, EventArgs e)
        {
            groupBox1.Width = button1.Width;
            groupBox2.Width = button1.Width;
            groupBox3.Width = button1.Width;
            groupBox4.Width = button1.Width;

            button2.Left = 10;
            button2.Width = (groupBox1.Width - 20);

            button3.Left = 10;
            button3.Width = (groupBox1.Width - 20);

            button4.Left = 10;
            button4.Width = (groupBox2.Width - 20);

            button5.Left = 10;
            button5.Width = (groupBox2.Width - 20);

            button6.Left = 10;
            button6.Width = (groupBox2.Width - 20);

            button7.Left = 10;
            button7.Width = (groupBox2.Width - 20);

            button9.Left = 10;
            button9.Width = (groupBox3.Width - 20);

            button10.Left = 10;
            button10.Width = (groupBox3.Width - 20);

            button11.Left = 10;
            button11.Width = (groupBox3.Width - 20);

            button12.Left = 10;
            button12.Width = (groupBox4.Width - 20);
        }

        UserControl tempUserControl;
        private void Form1_SizeChanged(object? sender, EventArgs e)
        {
            if (tempUserControl != null)
            {
                tempUserControl.Width = this.panel1.Width;
                tempUserControl.Height = this.panel1.Height;
            }
            splitContainer1.SplitterDistance = 240;

            if (this.WindowState == FormWindowState.Maximized || this.WindowState == FormWindowState.Normal)
            {
                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(100);
                    this.Invoke(() =>
                    {
                        if (tempUserControl != null)
                        {
                            tempUserControl.Width = this.panel1.Width;
                            tempUserControl.Height = this.panel1.Height;
                        }
                        splitContainer1.SplitterDistance = 240;
                    });
                });
            }
        }

        //人员录入
        private void button2_Click(object sender, EventArgs e)
        {
            ShowPage(new PersonnelEntryPage());
        }

        //机构录入
        private void button3_Click(object sender, EventArgs e)
        {
            ShowPage(new InstitutionalEntryPage());
        }

        //发卡
        private void button5_Click(object sender, EventArgs e)
        {
            ShowPage(new CarMangerPage());
        }

        //销户，挂失，解挂
        private void button4_Click(object sender, EventArgs e)
        {
            ShowPage(new CancellationPage(), ((Button)sender)?.Tag.ToString());
        }

        //月餐段汇总表
        private void button11_Click(object sender, EventArgs e)
        {
            ShowPage(new ReportFormPage(), ((Button)sender)?.Tag.ToString());
        }

        //餐段设置
        private void button12_Click(object sender, EventArgs e)
        {
            ShowPage(new MealSegmentSetPage());
        }

        private void ShowPage(UserControl userControl, string? name = "")
        {
            panel1.Controls.Clear();
            userControl.Width = panel1.Width;
            userControl.Height = panel1.Height;
            tempUserControl = userControl;
            userControl.Tag = name;
            userControl.Show();
            panel1.Controls.Add(userControl);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            ShowPage(new AdvertisingSetPage());
        }

        private async void button13_Click(object sender, EventArgs e)
        {

            if (UHFCardHelper.GetInstance().ComOpen)
            {
                try
                {

                    var res = UHFCardHelper.GetInstance().ReadCard();

                    if (string.IsNullOrEmpty(res))
                    {
                        MessageBox.Show("提示！！！\n 请放入卡片，在选择销卡...");
                        MessageLogNotify.GetInstance.Show("请放入卡片");
                        return;
                    }

                    if (res.Equals("666") || res.Equals("888") || res.Equals("999")) 
                    {
                        MessageBox.Show("超级卡不能被注销");
                        return;
                    }

                    var result = await HKLibHelper.GetUserList("");
                    UserListDto users = null;
                    result.ForEach(item =>
                    {
                        if (item.Cards.FirstOrDefault(t => t.CardNum.Equals(res)) != null)
                        {
                            users = item;
                            return;
                        }
                    });

                    if (users != null)
                    {
                        await HKLibHelper.CardStutasChange(new CardStutasDto()
                        {
                            keywrod = users.Name,
                            Stutas = 3,
                        });
                    }
                    var resz = MessageBox.Show($"提示！！！\n 当前卡号{res}，确定销卡?", "提示", MessageBoxButtons.YesNo);
                    if (resz == DialogResult.Yes)
                    {
                        var res1 = UHFCardHelper.GetInstance().WriteCard("000");
                        MessageBox.Show(res1.Res ? "000为默认新卡卡号，销卡成功" : "销卡失败");
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("销卡成功");
                }

            }
            else
            {
                MessageBox.Show("提示！！！\n 设备未连接...");
                MessageLogNotify.GetInstance.ShowWarning("设备未连接");
            }
        }
    }


}