using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Schedulers;
using MECF.Framework.Common.SubstrateTrackings;
using VirgoRT.Modules.LPs;
using VirgoRT.Scheduler;

namespace VirgoRT.Modules.Schedulers
{
    public class SchedulerLoadPort : SchedulerModule
    {
        public override bool IsAvailable
        {
            get { return _entity.IsReady /*&& _entity.IsOnline*/ && CheckTaskDone(); }

        }
        public override bool IsOnline
        {
            get { return true; }

        }
        public override bool IsError
        {
            get { return _entity.IsError; }

        }
        private LoadPortModule _entity = null;

        public SchedulerLoadPort(ModuleName module) : base(module.ToString())
        {
            _module = module.ToString();

            _entity = Singleton<RouteManager>.Instance.EFEM.LPEntity[module - ModuleName.LP1];

        }


        public bool Load()
        {
            //_busy = true;
            //_entity.Load(_chamber);
            return true;
        }

        public bool Unload()
        {
            //_busy = true;
            //_entity.Unloaded(_chamber);
            return true;
        }


        public bool Monitor()
        {

            return true;
        }


        public override bool IsReadyForPick(ModuleName robot, int slot, Hand blade)
        {
            if (blade == Hand.Both)
                return _entity.IsPrepareTransferReady(Module, EnumTransferType.Pick, slot)
                   && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot)
                   && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot + 1);

            return _entity.IsPrepareTransferReady(Module, EnumTransferType.Pick, slot)
                   && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot)
                   && WaferManager.Instance.CheckNoWafer(robot, (int)blade);
        }

        public override bool IsReadyForPlace(ModuleName robot, int slot, Hand blade)
        {
            return _entity.IsPrepareTransferReady(Module, EnumTransferType.Place, slot)
                   && WaferManager.Instance.CheckNoWafer(ModuleHelper.Converter(_module), slot);
        }

        public bool CheckTaskDone()
        {
            bool ret = false;
            switch (_task)
            {
                case TaskType.None:
                    ret = true;
                    break;
                case TaskType.PrepareTransfer:
                    ret = _entity.IsPrepareTransferReady(ModuleName.EfemRobot, EnumTransferType.Pick, 0);
                    break;
            }

            if (ret && _task != TaskType.None)
            {
                LogTaskDone(_task, "");
                _task = TaskType.None;
            }

            return ret;
        }

        internal bool CheckReadyRunJob()
        {
            return _entity.CheckReadyRunNewJob(this.Module);
        }

        internal bool CheckReadyTransfer()
        {
            return _entity.CheckReadyTransfer(this.Module);
        }
        internal bool CheckPlaced()
        {
            return _entity.LPDevice.HasCassette;
        }


        public void NoteJobStart()
        {
            _entity.LPDevice.NoteJobStart();

        }

        public void NoteJobComplete()
        {
            _entity.LPDevice.NoteJobComplete();
        }

        public bool CheckOrSetThickness(string thickness, out string s)
        {
            if (string.IsNullOrEmpty(_entity.LPDevice.ThicknessType))
            {
                if (thickness == "Thick")
                    _entity.LPDevice.SetThick();

                if (thickness == "Thin")
                    _entity.LPDevice.SetThin();

            }

            if (_entity.LPDevice.ThicknessType != thickness)
            {
                s = $"Thickness not match, Sequence Set={thickness}, Pod Set={_entity.LPDevice.ThicknessType}";
                return false;
            }

            s = "";
            return true;
        }
    }


}