using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Project.StateMachine;
using COMM;
using AR;

namespace Project.ViewForm
{
    public partial class fAuto : Form
    {
     
        public fAuto()
        {
            InitializeComponent();
            this.FormClosed += FAuto_FormClosed;
            PUB.sm.StepChanged += Sm_StepChanged;
            this.ctlAuto1.ButtonClick += CtlAuto1_ButtonClick;
            if (PUB.sm.Step == eSMStep.INIT || PUB.sm.Step == eSMStep.SYNC)
                this.ctlAuto1.Scean = CtlAuto.eScean.Progress;
            else
                this.ctlAuto1.Scean = CtlAuto.eScean.Normal;
            PUB.mapctl = new AGVControl.MapControl();
            PUB.mapctl.Dock = DockStyle.Fill;
            PUB.mapctl.Visible = true;
            PUB.mapctl.Font = this.panel1.Font;
            PUB.mapctl.BackColor = Color.FromArgb(32, 32, 32);
            this.panel1.Controls.Add(PUB.mapctl);
        }
        private void fAuto_Load(object sender, EventArgs e)
        {
            ctlAuto1.dev_agv = PUB.AGV;
            //     ctlAuto1.dev_plc = PUB.PLC;
            ctlAuto1.dev_bms = PUB.BMS;
            ctlAuto1.dev_xbe = PUB.XBE;
        
            PUB.AGV.DataReceive += AGV_DataReceive;
            
            
            //auto load 
            var path = new System.IO.DirectoryInfo("route");
            if (path.Exists == false) path.Create();
            var files = path.GetFiles("*.route");
            var fn = string.Empty;
            if (files.Any() == false)
            {
                fn = AR.UTIL.MakePath("sample.route");
            }
            else if (files.Count() == 1)
            {
                 fn = files.First().FullName;
            }
            if(fn.isEmpty()==false)
            {
                var fi = new System.IO.FileInfo(AR.UTIL.CurrentPath + "\\sample.route");
                if (fi.Exists)
                {
                    PUB.log.Add($"autoload : {fi.FullName}");
                    var rlt  = PUB.mapctl.LoadFromFile(fi.FullName,out string errmsg);
                    if (rlt == false) AR.UTIL.MsgE(errmsg);
                }
            }

            this.timer1.Start();
        }
        private void AGV_DataReceive(object sender, arDev.Narumi.DataEventArgs e)
        {
            switch (e.DataType)
            {
                case arDev.Narumi.DataType.TAG:
                    //_AGV 파일에서 위치조정을 함
                    //var tagno = PUB.AGV.data.TagNo;                    
                    //PUB.mapctl.SetCurrentPosition(tagno);
                    break;
            }
        }

        private void CtlAuto1_ButtonClick(CtlAuto.UIButton idx)
        {
            if (idx.cmd.Equals("EMG"))
            {
                PUB.log.Add("ui reset click");
                PUB.AGV.AGVErrorReset();
            }
        }

        private void Sm_StepChanged(object sender, StateMachine.StateMachine.StepChangeEventArgs e)
        {
            if (e.New == eSMStep.INIT || e.New == eSMStep.SYNC)
                this.ctlAuto1.Scean = CtlAuto.eScean.Progress;
            else
                this.ctlAuto1.Scean = CtlAuto.eScean.Normal;
        }

        private void FAuto_FormClosed(object sender, FormClosedEventArgs e)
        {
            timer1.Stop();
            PUB.sm.StepChanged -= Sm_StepChanged;
            this.ctlAuto1.ButtonClick -= CtlAuto1_ButtonClick;
            PUB.AGV.DataReceive -= AGV_DataReceive;
        }

        bool tmrun = false;
      
        private void fAuto_VisibleChanged(object sender, EventArgs e)
        {
            this.timer1.Enabled = this.Visible;
            if (timer1.Enabled) timer1.Start();
            else timer1.Stop();
        }

        private void timer1_Tick_1(object sender, EventArgs e)
        {
            //if (this.Visible == false) return;
            //if (tmrun == true) return;
            //tmrun = true;

            //this.ctlAuto1.OnUpdateMode = true;

            //if (this.ctlAuto1.Scean == CtlAuto.eScean.Progress)
            //{
            //    ctlAuto1.ProgressVal = PUB.Result.SMSG_ProgressValue;
            //    ctlAuto1.ProgressMax = PUB.Result.SMSG_ProgressMax;
            //    ctlAuto1.StatusMessage = VAR.STR?.Get(eVarString.StatusMessage) ?? string.Empty;
            //}
            //this.ctlAuto1.StopMessage = string.Empty;

            //if (PUB.sm.Step == StateMachine.eSMStep.RUN)
            //{
            //    this.ctlAuto1.runStep = PUB.sm.RunStep;
            //}
            //else
            //{
            //    this.ctlAuto1.runStep = ERunStep.READY;
            //}
            //this.ctlAuto1.OnUpdateMode = false;
            //this.ctlAuto1.Invalidate();

            //PUB.mapctl.PredictNextAction();

            //tmrun = false;
        }
    }
}
