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 CyberX8_RT.Modules;

namespace CyberX8_RT.Schedulers
{
    public class SchedulerLoadPort : SchedulerModule
    {
        public override bool IsAvailable
        {
            get { return _entity.IsIdle && IsLoaded && CheckTaskDone(); }

        }

        public override bool IsOnline
        {
            get { return true; }

        }

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

        }

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

        public bool IsLoaded
        {
            get { return _entity.EfemDevice[Module].IsLoaded; }
        }

        private EfemEntity _entity = null;

        public SchedulerLoadPort(ModuleName module) : base(module.ToString())
        {
            _module = module.ToString();
            _entity = Singleton<RouteManager>.Instance.EFEM;
        }
        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;
        }

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

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

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


        public void NoteJobStart()
        {
            _entity.NoteJobStart(ModuleHelper.Converter(_module));
        }

        public void NoteJobComplete()
        {
            _entity.NoteJobComplete(ModuleHelper.Converter(_module));
        }
    }
}