using AR;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;

namespace Project
{
    public partial class FMain
    {
        public Boolean PRINTER(eWorkPort target, eSMStep cmdIndex)
        {
            UInt16 idx = 1;
            var mv = PUB.Result.vModel;
            var mc = PUB.Result.mModel;
            var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
            var seqTime = PUB.sm.seq.GetTime(cmdIndex);
            var msgType = (Class.eStatusMesage)target;
            var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
            var Printer = target == eWorkPort.Left ? PUB.PrinterL : PUB.PrinterR;
            //var Jobtype = VAR.STR[eVarString.JOB_TYPE];
            var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];

            //option check
            var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
            var OPT_CameraOff = PUB.OPT_CAMERA();
            var OPT_BYPASS = PUB.OPT_BYPASS();



            //####################################################
            //###	작업시작
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                PUB.log.Add($"[{target}] Print operation started");
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //### 프린트 모션 위치 확인
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                sPositionData PosY, PosZ;
                if (target == eWorkPort.Left)
                {
                    PosY = MOT.GetLMPos(eLMLoc.READY);
                    PosZ = MOT.GetLZPos(eLZLoc.PICKON);
                }
                else
                {
                    PosY = MOT.GetRMPos(eRMLoc.READY);
                    PosZ = MOT.GetRZPos(eRZLoc.PICKON);
                }

                if (MOT.CheckMotionPos(seqTime, PosY, funcName) == false) return false;
                if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false;

                PUB.sm.seq.Update(cmdIndex);
                return false;
            }


            //####################################################
            //###	인쇄데이터 확인
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (item.VisionData.RID.isEmpty())
                {
                    if (target == eWorkPort.Left)
                    {
                        PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPRINTLDATA, eNextStep.PAUSE);
                    }
                    else
                    {
                        PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPRINTRDATA, eNextStep.PAUSE);
                    }
                    return false;
                }
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	인쇄데이터전송
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (OPT_PrinterOff == false)
                {
                    string zpl, qrdata;
                    zpl = Printer.makeZPL_210908(new Class.Reel
                    {
                        SID = item.VisionData.SID,
                        venderLot = item.VisionData.VLOT,
                        venderName = item.VisionData.VNAME,
                        qty = item.VisionData.QTY.isEmpty() ? -1 : int.Parse(item.VisionData.QTY),
                        id = item.VisionData.RID,
                        mfg = item.VisionData.MFGDATE,
                        PartNo = item.VisionData.PARTNO,
                    }, AR.SETTING.Data.DrawOutbox, out qrdata);
                    item.VisionData.ZPL = zpl;
                    item.VisionData.PrintQRData = qrdata;

                    PUB.log.Add("PRINT", $"[{target}] Printing");//QR=" + item.VisionData.QRData);

                    if (target == eWorkPort.Left)
                    {
                        var prn = Printer.Print(zpl);
                        //PUB.PrintSend(true, zpl); //PUB.PrintL.Write(zpl);
                        if (prn.result == false)
                        {
                            PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTL, eNextStep.ERROR);
                            return false;
                        }
                        else
                        {
                            SETTING.Counter.CountPrintL += 1;
                            item.PrintTime = DateTime.Now;
                        }
                    }
                    else
                    {
                        var prn = Printer.Print(zpl);
                        //PUB.PrintSend(false, zpl); //PUB.PrintR.Write(zpl);
                        if (prn.result == false)
                        {
                            PUB.log.AddE(prn.errmessage);
                            PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTR, eNextStep.ERROR);
                            return false;
                        }
                        else
                        {
                            SETTING.Counter.CountPrintR += 1;
                            item.PrintTime = DateTime.Now;
                        }
                    }
                }
                else PUB.log.AddAT($"[{target}] Printer function OFF (bypass or model or setting)");

                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	잠시대기
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                var WaitMS = target == eWorkPort.Left ? AR.SETTING.Data.PrintLWaitMS : AR.SETTING.Data.PrintRWaitMS;
                if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < WaitMS) return false;
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	위쪽흡기 ON
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (OPT_PrinterOff == false)
                {
                    if (target == eWorkPort.Left)
                    {
                        DIO.SetPrintLVac(ePrintVac.inhalation);
                    }
                    else
                    {
                        DIO.SetPrintRVac(ePrintVac.inhalation);
                    }
                }

                PUB.sm.seq.Update(cmdIndex);
                return false;
            }


            //####################################################
            //###	잠시대기
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < 100) return false;
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	아래쪽 블로우
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (OPT_PrinterOff == false && SETTING.Data.Disable_BottomAirBlow == false)
                {
                    if (target == eWorkPort.Left)
                    {
                        DIO.SetPrintLAir(true);
                    }
                    else
                    {
                        DIO.SetPrintRAir(true);
                    }
                }
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	잠시대기
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < 100) return false;
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //###	장비기술데이터저장
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                PUB.log.Add($"6.PRINT : EE-SAVE");
                SaveData_EE(item, (target == eWorkPort.Left ? "L" : "R"), "","printer");
                //RefreshList();  //목록업데이트
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            //####################################################
            //### spare
            //####################################################
            if (PUB.sm.seq.Get(cmdIndex) == idx++)
            {
                PUB.sm.seq.Update(cmdIndex);
                return false;
            }

            return true;
        }
    }
}