using Aitex.Core.Common;
using MECF.Framework.Common.Equipment;
using CyberX8_RT.Devices.EFEM;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Schedulers;
using MECF.Framework.Common.SubstrateTrackings;
using System.Diagnostics;
using CyberX8_Core;
using Aitex.Core.RT.SCCore;
using System.Threading;
using Aitex.Core.Util;
using MECF.Framework.Common.Utilities;


namespace CyberX8_RT.Modules.EFEM
{
    public class EfemMapDummyRoutine:ModuleRoutineBase, IRoutine
    {
        private enum MapDummyStep
        {
            MapDummy1,
            CheckDummy1Map,
            MapDummy2,
            CheckDummy2Map,
            End,
        }
        private EfemBase _efem;
        private EfemRobotMapRoutine _robotMapRoutine;
        bool _isDummy1Install = ModuleHelper.IsInstalled(ModuleName.Dummy1);
        bool _isDummy2Install = ModuleHelper.IsInstalled(ModuleName.Dummy2);
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="efem"></param>
        public EfemMapDummyRoutine(EfemBase efem) : base(ModuleName.EfemRobot)
        {
            _efem = efem;
            _robotMapRoutine=new EfemRobotMapRoutine(efem);
        }
        /// <summary>
        /// 启动
        /// </summary>
        /// <param name="objs"></param>
        /// <returns></returns>
        public RState Start(params object[] objs)
        {
            return Runner.Start(Module, "Map Dummy");
        }
        /// <summary>
        /// 监控
        /// </summary>
        /// <returns></returns>
        public RState Monitor()
        {
            Runner.RunIf(MapDummyStep.MapDummy1, CheckDummyAvaible(ModuleName.Dummy1, _isDummy1Install),
                    () => { return Map(ModuleName.Dummy1);},_delay_1ms)
                .WaitWithStopConditionIf(MapDummyStep.CheckDummy1Map, CheckDummyAvaible(ModuleName.Dummy1, _isDummy1Install),
                    () => CommonFunction.CheckRoutineEndState(_robotMapRoutine), () => CommonFunction.CheckRoutineStopState(_robotMapRoutine))
                .RunIf(MapDummyStep.MapDummy2, CheckDummyAvaible(ModuleName.Dummy2, _isDummy2Install),
                    () => { return Map(ModuleName.Dummy2); }, _delay_1ms)
                .WaitWithStopConditionIf(MapDummyStep.CheckDummy2Map, CheckDummyAvaible(ModuleName.Dummy2, _isDummy2Install),
                    () => CommonFunction.CheckRoutineEndState(_robotMapRoutine), () => CommonFunction.CheckRoutineStopState(_robotMapRoutine))
                .End(MapDummyStep.End, ActionDone, 0);
            return Runner.Status;
        }
        private bool CheckDummyAvaible(ModuleName moduleName, bool install)
        {
            if (!install)
            {
                return false;
            }
            if (ModuleHelper.IsDummy(moduleName))
            {
                DummyDevice dummyDevice = Singleton<RouteManager>.Instance.EFEM.GetDummyDevice(moduleName - ModuleName.Dummy1);
                if (dummyDevice == null)
                {
                    return false;
                }
                return dummyDevice.HasCassette;
            }
            return false;
        }
        /// <summary>
        /// Map功能
        /// </summary>
        /// <returns></returns>
        private bool Map(ModuleName moduleName)
        {
            return _robotMapRoutine.Start(moduleName) == RState.Running;
        }

        private bool ActionDone()
        {
            return true;
        }

        public void Abort()
        {
        }
    }
}