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
    {
        const string server = "http://0.0.0.0:58137";
        public Form1()
        {
            InitializeComponent();
            WebServer.Open(server);
            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 {
                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", 5000);
            Monitor.MaxMenory = (int)numericUpDown1.Value;
            numericUpDown1.ValueChanged += numericUpDown1_ValueChanged;
        }

        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)
        {

        }
    }
}