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

namespace Venus_RT.Modules.Schedulers
{
    public class SchedulerVCE : SchedulerModule
    {
        #region 私有变量
        private VceEntity _entity;
        #endregion

        #region 公开变量
        public override bool IsAvailable => _entity.IsIdle && CheckTaskDone();
        public override bool IsOnline => true;
        public override bool IsError => _entity.IsError;
        

        #endregion
        public SchedulerVCE(ModuleName module) : base(module.ToString())
        {
            _module = module.ToString();
            _entity = Singleton<RouteManager>.Instance.VCE;
        }
        public override bool IsReadyForPick(ModuleName robot, int slot, Hand blade)
        {
            return _entity.IsPrepareTransferReady(Module, EnumTransferType.Pick, slot)
                   && WaferManager.Instance.CheckHasWafer(ModuleHelper.Converter(_module), slot);
        }

        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;
        }

    }
}