using ConfigHelper;
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ScanCodeServer
{
    public partial class Form1 : Form
    {
        string server = "http://0.0.0.0:58137";
        public Form1()
        {
            InitializeComponent();
            server = Config.Get("Addr", "http://0.0.0.0:58137");
            WebServer.Open(server);
            textBox_addr.Text = Config.Get("Addr", "http://0.0.0.0:58137");
            server = textBox_addr.Text;
            FormClosing += Form1_FormClosing;
            Shown += Form1_Shown;
            Resize += Form1_Resize;
            Monitor.OverTimes += Monitor_OverTimes;
        }

        private void Monitor_OverTimes(object sender, EventArgs e)
        {
            this.Invoke((EventHandler)delegate {
                Common.log.Error($"内存达到阈值触发程序退出:已调用识别:{Monitor.ScanTimes}次,当前占用内存:{Monitor.ScanMemory}mb");
                Thread.Sleep(1000);
                退出ToolStripMenuItem_Click(null, EventArgs.Empty);
            },sender,e);

            
        }

        bool needclose = false;
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            
            if (!needclose)
            {
                e.Cancel = true;
                Hide();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            numericUpDown1.Value = ConfigHelper.Config.Get<int>("MaxMenory", 8000);
            Monitor.MaxMenory = (int)numericUpDown1.Value;
            numericUpDown1.ValueChanged += numericUpDown1_ValueChanged;

            textBox_addr.Text = server;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Monitor.ScanMemory = GetMemory();
            label1.Text = $"服务器地址:{server}\r\n";
            label1.Text += $"服务器状态:{(WebServer.IsOpen?"运行中":"已停止")}\r\n";
            label1.Text += $"启动后已调用识别:{Monitor.ScanTimes}次\r\n";
            label1.Text += $"当前占用内存:{Monitor.ScanMemory}mb\r\n";
            
        }
        public static int GetMemory()
        {
            Process proc = Process.GetCurrentProcess();
            long b = proc.PrivateMemorySize64;
            for (int i = 0; i < 2; i++)
            {
                b /= 1024;
            }
            return (int)b;
        }
        private void Form1_Shown(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                Hide();
            }
        }
        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WebServer.Close();
            needclose = true;
            this.Close();
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Show();
            WindowState = FormWindowState.Normal;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            ConfigHelper.Config.Set<int>("MaxMenory", (int)numericUpDown1.Value);
            //ConfigHelper.Config.SaveChange();
            Monitor.MaxMenory = (int)numericUpDown1.Value;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                var u = new Uri(textBox_addr.Text);
                Config.Set("Addr", u.ToString());
                //Config.SaveChange();
                WebServer.Close();
                server = textBox_addr.Text;
                WebServer.Open(server);
            }
            catch {
                MessageBox.Show("输入的格式不正确");
            }
        }

        private void btn_test_Click(object sender, EventArgs e)
        {
            string file = "test.bmp";
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "Select an Image";
            openFileDialog.Filter = "Image files (*.bmp, *.png)|*.bmp; *.png;"; // 设置对话框的筛选条件

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                file = openFileDialog.FileName;
            }

            Bitmap bitmap = new Bitmap(file);
            WebWork webWork = new WebWork();
            HDCodeHelper.Bitmap2HObjectBpp24(bitmap, out HObject ho_Image);
            //bitmap.Dispose();
            RemoteDecodeParam remoteDecodeParam = new RemoteDecodeParam();
            remoteDecodeParam.codeTypeList = new string[] { "barcode", "Data Matrix ECC 200", "QR Code", "PDF417", "eyem" };
            remoteDecodeParam.codeCount = 3;
            remoteDecodeParam.timeout = 3000;
            webWork.Process(ho_Image, bitmap, remoteDecodeParam);
        }

        private void 参数ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AdvanceConfigForm advanceConfigForm = new AdvanceConfigForm();
            advanceConfigForm.ShowDialog();
        }
    }
}