using System;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using CyberX8_Core;

namespace CyberX8_RT.Modules.LPs
{
    class LoadPortUnloadRoutine : ModuleRoutineBase,  IRoutine
    {
        enum RoutineStep
        {
            WaitEFEMIdle,
            Unload,
            End,
        }

        private int _timeout = 0;
 
        private LoadPortModule _lpModule;
        public LoadPortUnloadRoutine(LoadPortModule lpModule) : base(ModuleHelper.Converter(lpModule.Module))
        {
            _lpModule = lpModule;
            Name = "Unload";
 
        }
 
        public RState Start(params object[] objs)
        {
            Reset();

            _timeout = SC.GetValue<int>("EFEM.LoadPort.MotionTimeout");

            if (!_lpModule.LPDevice.HasCassette)
            {
                LOG.Write(eEvent.WARN_EFEM_COMMON_WARN, Module, $"{Module} not found carrier, can not unload");
                return RState.Failed;
            }

            Notify($"Start");

            return Runner.Start(Module, Name);
        }


        public RState Monitor()
        {
            Runner.Wait(RoutineStep.WaitEFEMIdle, () => _lpModule.IsRobotIdle)
                .Run(RoutineStep.Unload, Unload, CheckDevice, _timeout * 1000)
                    .End(RoutineStep.End, NullFun, _delay_1s);

            return Runner.Status;
        }

        public bool Unload()
        {
            Notify($"Start Unload {_lpModule.Name}");

            _lpModule.LPDevice.Unload();

            return true;
        }

        bool CheckDevice()
        {
            if (_lpModule.LPDevice.IsError)
                return false;

            if (_lpModule.LPDevice.IsBusy)
                return false;

            return true;
        }
        public void Abort()
        {
            
        }
 
    }
}