using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Project.StateMachine;
using COMM;
using AR;

namespace Project
{
    public partial class fMain
    {

        public Boolean _SM_RUN_GOUP(bool isFirst, TimeSpan stepTime)
        {
            if (runStepisFirst)
            {
                //   VAR.BOOL[eVarBool.FLAG_NEXTSTOP_MARK] = false;//);
                VAR.BOOL[eVarBool.FLAG_NEXTSTOP_ALIGN] = false;
            }

            //HW 연결오류
            if (PUB.AGV.IsOpen == false)
            {
                PUB.Result.SetResultMessage(eResult.Hardware, eECode.AGVCONN, eNextStep.ERROR);
                return false;
            }

            //충전 상태가 OFF되어야 동작하게한다
            if (_SM_RUN_CHGOFF(isFirst, stepTime) == false)
                return false;

            //라이더멈춤이 설정되어있다면 음성으로 알려준다 200409
            if (PUB.AGV.system1.stop_by_front_detect == true)
            {
                var tsSpeak = DateTime.Now - LastSpeakTime;
                if (tsSpeak.TotalSeconds >= PUB.setting.doorSoundTerm)
                {
                    PUB.Speak(Lang.전방에물체가감지되었습니다);
                    LastSpeakTime = DateTime.Now;
                }
                return false;
            }

            //현재 위치가 결정되어있는지 체크한다
            if (_SM_RUN_POSCHK(isFirst, stepTime) == false)
                return false;

            var idx = 1;
            if (PUB.sm.RunStepSeq == idx++)
            {
                //상차 가능 조건 확인
                if (PUB.Result.TargetPos == ePosition.NONE)
                {
                    PUB.Result.SetResultMessage(eResult.Hardware, eECode.NOTALLOWUP, eNextStep.ERROR);
                }
                else
                {
                    PUB.AddEEDB($"상차작업시작({PUB.Result.TargetPos})");
                    PUB.Speak(Lang.상차작업을시작합니다);
                    PUB.sm.UpdateRunStepSeq();
                }
                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {
                //모션 전후진 제어
                if (UpdateMotionPositionForMark("GOUP"))
                    PUB.sm.UpdateRunStepSeq();

                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {
                //장비멈춤확인
                if (PUB.AGV.system1.agv_run == true)
                {
                    var ts = DateTime.Now - LastCommandTime;
                    if (ts.TotalMilliseconds > 2000)
                    {
                        PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
                        LastCommandTime = DateTime.Now;
                    }
                }
                else
                {
                    //움직이지 않고 있다면 다시 이동을 시켜준다.
                    PUB.log.Add("이동 정지 확인");
                    PUB.sm.UpdateRunStepSeq();
                }
                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {
                if (PUB.AGV.system1.agv_run == true)
                {
                    var ts = DateTime.Now - LastCommandTime;
                    if (ts.TotalMilliseconds > 2000)
                    {
                        PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
                        LastCommandTime = DateTime.Now;
                    }
                }

                //커버를 자동으로 내려준다
                CoverControlTime = DateTime.Now;
                UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를내립니다);
                PUB.AGV.LiftControl(arDev.Narumi.LiftCommand.DN);
                VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = true;
                PUB.sm.UpdateRunStepSeq();
                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {
                if (PUB.AGV.system1.agv_run == true)
                {
                    var ts = DateTime.Now - LastCommandTime;
                    if (ts.TotalMilliseconds > 2000)
                    {
                        PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
                        LastCommandTime = DateTime.Now;
                    }
                }


                //커버 내림이 완료될때까지 기다린다
                if (true)
                {
                    VAR.BOOL[eVarBool.WAIT_COVER_DOWN] = false;
                    PUB.Result.NextPos = ePosition.NONE;
                    PUB.sm.UpdateRunStepSeq();
                }
                else
                {
                    

                    //경과시간이 10초가 지나면 5초마다 음성을 출력한다
                    var tsCover = DateTime.Now - CoverControlTime;
                    if (tsCover.TotalSeconds >= 7)
                    {
                        PUB.Speak(Lang.안전커버를내려주세요);
                        CoverControlTime = DateTime.Now;
                    }
                }
                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {
                if (PUB.AGV.system1.agv_run == true)
                {
                    var ts = DateTime.Now - LastCommandTime;
                    if (ts.TotalMilliseconds > 2000)
                    {
                        PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
                        LastCommandTime = DateTime.Now;
                    }
                    return false;
                }


                //상차는 여기서 수량확인한다
                if (PUB.Result.TargetPos == ePosition.F1)
                    PUB.counter.CountUp1 += 1;
                else if (PUB.Result.TargetPos == ePosition.F2)
                    PUB.counter.CountUp2 += 1;
                else if (PUB.Result.TargetPos == ePosition.F3)
                    PUB.counter.CountUp3 += 1;
                else if (PUB.Result.TargetPos == ePosition.F4)
                    PUB.counter.CountUp4 += 1;
                //else if (PUB.Result.TargetPos == ePosition.QA)
                //    PUB.counter.CountQA += 1;
                PUB.counter.Save();
                PUB.sm.UpdateRunStepSeq();
                return false;
            }
            else if (PUB.sm.RunStepSeq == idx++)
            {

                //IO업데이트 간격 전송
                UpdateProgressStatus(stepTime.TotalSeconds, 5, Lang.안전커버를올려주세요);
                PUB.Speak(Lang.안전커버를올리면상차가완료됩니다);
                PUB.sm.UpdateRunStepSeq();
                VAR.BOOL[eVarBool.WAIT_COVER_UP] = true;
                PUB.Result.NextPos = ePosition.NONE;
                CoverControlTime = DateTime.Now;
                return false;
            }

            else if (PUB.sm.RunStepSeq == idx++)
            {
                if (PUB.AGV.system1.agv_run == true)
                {
                    var ts = DateTime.Now - LastCommandTime;
                    if (ts.TotalMilliseconds > 2000)
                    {
                        PUB.AGV.AGVMoveStop("SM_RUN_GOUP");// PUB.PLC.Move(Device.PLC.Rundirection.Stop, "GOUP:위치확정");
                        LastCommandTime = DateTime.Now;
                    }
                }


                //커버 올림이 완료될때까지 기다린다
                if (VAR.BOOL[eVarBool.FLAG_LIMITHIGH] == true)
                {
                    VAR.BOOL[eVarBool.WAIT_COVER_UP] = false;
                    VAR.BOOL[eVarBool.ITEMON] = true;
                    PUB.sm.UpdateRunStepSeq();
                }
                else
                {
                    //경과시간이 10초가 지나면 5초마다 음성을 출력한다
                    var tsCover = DateTime.Now - CoverControlTime;
                    if (tsCover.TotalSeconds >= PUB.setting.doorSoundTerm)
                    {
                        PUB.Speak(Lang.안전커버를올려주세요);
                        CoverControlTime = DateTime.Now;

                        ////한쪽이 올라가 있는 상태에..
                        //if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == true)
                        //{
                        //    //모터는 올리는 방향일때에...
                        //    if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LDIR) == true)
                        //    {
                        //        //모터가 멈춰있을때에..
                        //        if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_LRUN) == false)
                        //        {
                        //            //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)

                        //            //왼쪽이 올라가 있지 않은 경우
                        //            if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false)
                        //                PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up);

                        //            //오른쪽이 올라가 있지 않은 경우
                        //            if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false)
                        //                PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up);
                        //        }
                        //    }
                        //}
                        //if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == true)
                        //{
                        //    //모터는 올리는 방향일때에...
                        //    if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RDIR) == true)
                        //    {
                        //        //모터가 멈춰있을때에..
                        //        if (PUB.PLC.GetValueO(arDev.FakePLC.DOName.PINO_GUIDEMOTOR_RRUN) == false)
                        //        {
                        //            //자동으로 올려준다 (센서가 간혹 인식이 안되어서 .대기하는 경우가 잇음)

                        //            //왼쪽이 올라가 있지 않은 경우
                        //            if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_LU) == false)
                        //                PUB.PLC.ZMot_Left(arDev.FakePLC.ZMotDirection.Up);

                        //            //오른쪽이 올라가 있지 않은 경우
                        //            if (PUB.PLC.GetValueI(arDev.FakePLC.DIName.PINI_LIMIT_RU) == false)
                        //                PUB.PLC.ZMot_Right(arDev.FakePLC.ZMotDirection.Up);
                        //        }
                        //    }
                        //}
                    }
                }
                return false;
            }

            PUB.AddEEDB($"상차작업완료({PUB.Result.TargetPos})");
            return true;
        }
    }
}
