using FileManager;
using MeasureData;
using MeasureThread;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static MeasureThread.ThreadStatusEventArgs;

namespace HOZProject
{
    public partial class FormHOZMain : Form
    {
        #region 成员变量
        private BackgroundWorker m_BackgroundWorker;// 申明后台对象
        /// <summary>
        /// 测量文件
        /// </summary>
        public MeasureFile m_MeasureFile;

        /// 测量线程  
        public Measure m_Ms;

        /// <summary>
        /// 显示日志窗体
        /// </summary>
        Form m_FormLog = null;
        /// <summary>
        /// 显示实例化窗体
        /// </summary>
        Form m_FormInit = null;

        /// <summary>
        /// 初始化用户控件
        /// </summary>
        UControl_Init uControl_Init = null;
        #endregion

        #region 构造函数
        public FormHOZMain()
        {
            InitializeComponent();
            //在线程操作过程中，可以设置控件属性
            Control.CheckForIllegalCrossThreadCalls = false;
            m_BackgroundWorker = new BackgroundWorker(); // 实例化后台对象 
            m_BackgroundWorker.WorkerReportsProgress = true; // 设置可以通告进度 
            m_BackgroundWorker.WorkerSupportsCancellation = true; // 设置可以取消 
            m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork);
            m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress);
            m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork);

            LogManager.InitManulLog();
        }
        #endregion

        #region 测量线程
        void DoWork(object sender, DoWorkEventArgs e)
        {
            m_Ms = new Measure();
            m_Ms.InitMeas(m_MeasureFile);
            m_Ms.SendThreadStatus += new ThreadStatusHandler(displayMessage); //注册事件
            m_Ms.SendCutHolesStatus += new CutHolesStatusHandler(displayCutHoleMessage); //注册事件
            //设置控件操作
            SetWinControlMeasureState(false);
            //自动测量的全过程
            m_Ms.DoMeasure();
            //定位
            //切割
            //分析位置
            //截面
        }

        public void displayMessage(object sender, ThreadStatusEventArgs e)
        {
            //主界面显示内容
            this.BeginInvoke((Action)delegate
            {
                //流程编号
                string eCode = e.Step_Code;
                //流程开始时间
                DateTime eTime = e.Time;
                //图片对象
                PictureInformation ePictureInformation = e.Picture_Information;
                //当前状态
                string eState = e.State;
                this.listmsg.Items.Add(e.Time.ToString() +"_"+ e.State);
                //显示流程中对应编号的内容
                MeasureMsgManage.ShowMsgContent(this, e);
                ShowLogInfo();
            });
        }
        public void displayCutHoleMessage(object sender, CutHolesStatusEventArgs e)
        {
            //主界面显示内容
            this.BeginInvoke((Action)delegate
            {
                //this.listmsg.Items.Add(e.HoleName.ToString() + e.State);
                ChangeCutHoleState(e.HoleName.ToString(), Convert.ToInt32(e.State));
            });
        }

        void UpdateProgress(object sender, ProgressChangedEventArgs e)
        {
        }
        void CompletedWork(object sender, RunWorkerCompletedEventArgs e)
        {
            //设置控件操作
            SetWinControlMeasureState(true);
        }
        #endregion

        private void FormHOZMain_Load(object sender, EventArgs e)
        {
            //加载控件的点击事件
            this.Click += new EventHandler(FormHOZMain_Click);
            plFill.Click += new EventHandler(FormHOZMain_Click);
            plTop.Click += new EventHandler(FormHOZMain_Click);
            plLeft.Click += new EventHandler(FormHOZMain_Click);
            plLeftContent.Click += new EventHandler(FormHOZMain_Click);
            pbImage.Click += new EventHandler(FormHOZMain_Click);

            //加载窗口移动事件
            this.MouseDown += new MouseEventHandler(FormHOZMain_MouseDown);
            //plFill.MouseDown += new MouseEventHandler(FormHOZMain_MouseDown);
            //plTop.MouseDown += new MouseEventHandler(FormHOZMain_MouseDown);
            //plLeft.MouseDown += new MouseEventHandler(FormHOZMain_MouseDown);
            //plLeftContent.MouseDown += new MouseEventHandler(FormHOZMain_MouseDown);
            //新建
            NewCreate();
        }

        #region 创建切孔列表信息
        /// <summary>
        /// 创建切孔列表信息
        /// </summary>
        /// <param name="ListCutHole"></param>
        public void CreateCutHoleList(List<CutHole> ListCutHole)
        {
            //清空左侧Panel中的切孔控件
            ClearPanelControls();
            for (int i = ListCutHole.Count - 1; i >= 0; i--)
            {
                UControl_CutHole ucCutHole = new UControl_CutHole(this);
                ucCutHole.Dock = DockStyle.Top;
                ucCutHole.CutHoleName = ListCutHole[i].HoleName;

                //显示切孔参数信息
                if (ucCutHole.UControl_ParaInfo == null)
                {
                    ucCutHole.UControl_ParaInfo = new UControl_ParaInfo(this);
                }
                plPrarInfo.Width = ucCutHole.UControl_ParaInfo.Width;
                plPrarInfo.Height = ucCutHole.UControl_ParaInfo.Height;
                //设置当前样品的参数信息
                ucCutHole.UControl_ParaInfo.Name = ListCutHole[i].HoleName;
                ucCutHole.UControl_ParaInfo.CutHoleName = ListCutHole[i].HoleName;
                ucCutHole.UControl_ParaInfo.Position = ListCutHole[i].Position;
                ucCutHole.UControl_ParaInfo.StartTime = ListCutHole[i].START.ToString();
                ucCutHole.UControl_ParaInfo.EndTime = ListCutHole[i].END.ToString();
                ucCutHole.UControl_ParaInfo.State = ListCutHole[i].STATE.ToString();
                ucCutHole.UControl_ParaInfo.IsSwitch = ListCutHole[i].SWITCH;
                ucCutHole.UControl_ParaInfo.Dock = DockStyle.Fill;
                ucCutHole.UControl_ParaInfo.ShowParaInfo();
                plPrarInfo.Controls.Add(ucCutHole.UControl_ParaInfo);
                plLeftContent.Controls.Add(ucCutHole);
            }
            plPrarInfo.Visible = false;
        } 
        #endregion

        //隐藏处理层
        private void FormHOZMain_Click(object sender, EventArgs e)
        {
            if (plPrarInfo.Visible)
            {
                plPrarInfo.Visible = false;
            }
        }

        #region 设置控件在线程过程中的编辑状态
        /// <summary>
        /// 设置控件在线程过程中的编辑状态
        /// </summary>
        /// <param name="cState"></param>
        private void SetWinControlMeasureState(bool cState)
        {
            pbNew.Enabled = cState;
            pbOpen.Enabled = cState;
            pbSave.Enabled = cState;
            pbInit.Enabled = cState;
            pbImportTemplateFile.Enabled = cState;
            pbLog.Enabled = cState;
        }
        #endregion
        
        #region 窗体 最大化 最小化 关闭 按钮事件
        private void pbMin_MouseEnter(object sender, EventArgs e)
        {
            this.pbMin.BackgroundImage = global::HOZProject.Properties.Resources.Min_Blue;
        }

        private void pbMin_MouseLeave(object sender, EventArgs e)
        {
            this.pbMin.BackgroundImage = global::HOZProject.Properties.Resources.Min_Gray;
        }

        private void pbMax_MouseEnter(object sender, EventArgs e)
        {
            this.pbMax.BackgroundImage = global::HOZProject.Properties.Resources.Max_Blue;
        }

        private void pbMax_MouseLeave(object sender, EventArgs e)
        {
            this.pbMax.BackgroundImage = global::HOZProject.Properties.Resources.Max_Gray;
        }

        private void pbClose_MouseEnter(object sender, EventArgs e)
        {
            this.pbClose.BackgroundImage = global::HOZProject.Properties.Resources.exit_Red;
        }

        private void pbClose_MouseLeave(object sender, EventArgs e)
        {
            this.pbClose.BackgroundImage = global::HOZProject.Properties.Resources.exit_Gray;
        }

        private void pbClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void pbMin_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        private void pbMax_Click(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Maximized)
            {
                this.WindowState = FormWindowState.Normal;
            }
            else
            {
                this.WindowState = FormWindowState.Maximized;
            }
            //窗体据中
            this.StartPosition = FormStartPosition.CenterScreen;
        }
        #endregion

        #region 新建、保存、打开、初始化、导入配置、查看日志
        private void pbNew_Click(object sender, EventArgs e)
        {
            NewCreate();
        }

        private void NewCreate()
        {
            m_MeasureFile = new MeasureFile();
            if (!m_MeasureFile.New())
            {
                return;
            }
            else
            {
                //清空内容容器中的控件
                ClearPanelControls();
            }
        }

        private void pbSave_Click(object sender, EventArgs e)
        {
            if (m_MeasureFile == null)
            {
                MessageBox.Show("请新建一个测量文件");
            }
            else
            {
                m_MeasureFile.Save();
            }
        }

        private void pbOpen_Click(object sender, EventArgs e)
        {

        }

        private void pbInit_Click(object sender, EventArgs e)
        {
            if (uControl_Init == null)
            {
                uControl_Init = new UControl_Init(this);
                uControl_Init.ReloadConfig();
            }
            if (m_FormInit == null)
            {
                m_FormInit = new Form();
            }
            m_FormInit.StartPosition = FormStartPosition.CenterScreen;
            m_FormInit.FormBorderStyle = FormBorderStyle.None;
            m_FormInit.Width = uControl_Init.Width;
            m_FormInit.Height = uControl_Init.Height;
            if (m_FormInit.Controls.Count == 0)
            {
                m_FormInit.Controls.Add(uControl_Init);
            }
            m_FormInit.ShowDialog();
        }

        private void pbImportTemplateFile_Click(object sender, EventArgs e)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            string m_TemplateFilePath = config.AppSettings.Settings["TemplateFilePath"].Value.ToString();
            //判断保存的路径是否存在
            if (!Directory.Exists(m_TemplateFilePath))
            {
                //创建路径
                Directory.CreateDirectory(m_TemplateFilePath);
            }
            //打开默认路径
            OpenFileDialog openFileDialog = new OpenFileDialog();
            //设置默认打开路径(绝对路径)
            openFileDialog.InitialDirectory = m_TemplateFilePath;
            openFileDialog.Filter = "样品参数文件|*.cfg";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (uControl_Init == null)
                {
                    uControl_Init = new UControl_Init(this);
                }
                //设置选择的模板文件
                uControl_Init.ReadConfigPath = openFileDialog.FileName;
                //获取文件
                uControl_Init.ReadConfigInfo();
            }
        }

        private void pbLog_Click(object sender, EventArgs e)
        {
            m_FormLog = new Form();
            m_FormLog.StartPosition = FormStartPosition.CenterScreen;
            UControl_Log uControl_Log = new UControl_Log();
            m_FormLog.FormBorderStyle = FormBorderStyle.None;
            m_FormLog.Width = uControl_Log.Width;
            m_FormLog.Height = uControl_Log.Height;
            uControl_Log.Name = "UControl_Log";
            //获取日志信息
            if (listmsg.Items.Count>0)
            {
                string[] strLog = new string[listmsg.Items.Count];
                for (int i = 0; i < listmsg.Items.Count; i++)
                {
                    //赋值给数组
                    strLog[i] = listmsg.Items[i].ToString();
                }
                uControl_Log.ShowProcessLogInfo(strLog);
            }
            m_FormLog.Controls.Add(uControl_Log);
            m_FormLog.ShowDialog();
        }

        //显示日志
        private void ShowLogInfo()
        {
            if (m_FormLog != null)
            {
                foreach (Control item in m_FormLog.Controls)
                {
                    if (item is UserControl)
                    {
                        if (item.Name == "UControl_Log")
                        {
                            UControl_Log ucLog = (UControl_Log)item;
                            //获取日志信息
                            if (listmsg.Items.Count > 0)
                            {
                                string[] strLog = new string[listmsg.Items.Count];
                                for (int i = 0; i < listmsg.Items.Count; i++)
                                {
                                    //赋值给数组
                                    strLog[i] = listmsg.Items[i].ToString();
                                }
                                ucLog.ShowProcessLogInfo(strLog);
                            }
                        }
                    }
                }
            }
        }
        #endregion
        
        #region 修改切孔状态
        /// <summary>
        /// 修改切孔状态
        /// </summary>
        /// <param name="cutHoleCode"></param>
        /// <param name="State"></param>
        private void ChangeCutHoleState(string CutHoleName, int State)
        {
            foreach (Control item in plLeftContent.Controls)
            {
                if (item is UserControl)
                {
                    UControl_CutHole cutHole = (UControl_CutHole)item;
                    if (cutHole.CutHoleName == CutHoleName)
                    {
                        Button btnCutHole = (Button)cutHole.Controls.Find("btnCutHole", false)[0];
                        switch (State)
                        {
                            //开始运行
                            case (int)ThreadState.InProcess:
                                btnCutHole.BackColor = Color.Yellow;
                                break;
                            //完成
                            case (int)ThreadState.Success:
                                btnCutHole.BackColor = Color.GreenYellow;
                                break;
                            //错误
                            case (int)ThreadState.Failed:
                                btnCutHole.BackColor = Color.Red;
                                break;
                        }
                        break;
                    }
                }
            }
        } 
        #endregion

        #region 拖动无窗体的控件
        [DllImport("user32.dll")]//拖动无窗体的控件
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;
        private void FormHOZMain_MouseDown(object sender, MouseEventArgs e)
        {
            if (this.WindowState == FormWindowState.Normal)
            {
                //拖动窗体
                ReleaseCapture();
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
            }
        } 
        #endregion

        #region 开始、结束线程事件
        private void pbStart_Click(object sender, EventArgs e)
        {
            if (m_MeasureFile == null)
            {
                MessageBox.Show("请新建一个测量文件");
                //listmsg.Items.Clear();
            }
            else
            {
                if (m_BackgroundWorker.IsBusy)
                {
                    MessageBox.Show("线程已经运行");
                    return;
                }
                m_BackgroundWorker.RunWorkerAsync(this);
            }
        }

        private void pbStop_Click(object sender, EventArgs e)
        {
            if (m_BackgroundWorker.IsBusy)
            {
                m_BackgroundWorker.CancelAsync();
            }
        }
        #endregion

        #region 清空内容容器中的控件
        /// <summary>
        /// 清空内容容器中的控件
        /// </summary>
        private void ClearPanelControls()
        {
            //清空内容容器中的控件
            plLeftContent.Controls.Clear();
            plPrarInfo.Controls.Clear();
        }
        #endregion

        #region 测试修改切孔中流程状态
        private void button1_Click(object sender, EventArgs e)
        {
            if (plPrarInfo.Controls.Count > 0)
            {
                string name = textBox1.Text;
                string code = textBox2.Text;
                int state = Convert.ToInt32(comboBox1.Text);
                foreach (Control item in plPrarInfo.Controls)
                {
                    if (item is UserControl)
                    {
                        if (item.Name == name)
                        {
                            UControl_ParaInfo uControl_ParaInfo = (UControl_ParaInfo)item;
                            TimeLineItem[] ParaItem = uControl_ParaInfo.TlItem;
                            foreach (TimeLineItem tlItem in ParaItem)
                            {
                                if (tlItem.Code == code)
                                {
                                    tlItem.State = state;
                                    break;
                                }
                            }
                            uControl_ParaInfo.TimeLineInvalidate();
                            break;
                        }
                    }
                }
            }
        } 
        #endregion
    }
}
