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

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

        public string CarrierIdSetPoint { get; set; }

        private int _timeout = 0;

        private LoadPortModule _lpModule;
        public LoadPortWriteCarrierIdRoutine(LoadPortModule lpModule) : base(ModuleHelper.Converter(lpModule.Module))
        {
            _lpModule = lpModule;

            Name = "Write Carrier ID";

        }


        public RState Start(params object[] objs)
        {
            Reset();

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

            Notify($"Start");

            return Runner.Start(Module, Name);
        }


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

            return Runner.Status;
        }


        public bool WriteCarrierId()
        {
            Notify($"Start write carrier id {CarrierIdSetPoint} to {_lpModule.LPDevice.Module}");

            _lpModule.LPDevice.WriteCarrierID(CarrierIdSetPoint);
            return true;
            
        }

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

            if (_lpModule.LPDevice.IsBusy)
                return false;

            return true;
        }

        public void Abort()
        {

        }

    }
}