using Aitex.Core.RT.Fsm;
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Modules.Loader;
using CyberX8_RT.Modules.PUF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CyberX8_RT.Modules.Transporter;

namespace CyberX8_RT.Modules
{
    public class ModuleHomeAllRoutine : RoutineBase, IRoutine
    {
        private enum HomeStep
        {
            DualPufHome,
            DualPufHomeWait,
            LoaderHome,
            LoaderHomeWait,
            LoaderTransporterHome,
            LoaderTransporterHomeWait,
            ProcessTransporterHome,
            ProcessTransporterHomeWait,
            End
        }
        #region 内部变量
        private PUFEntity _puf1Entity;
        private PUFEntity _puf2Entity;
        private LoaderEntity _loaderEntity;
        private TransporterEntity _loaderTransporterEntity;
        private TransporterEntity _processTransporterEntity;
        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="module"></param>
        public ModuleHomeAllRoutine(string module) : base(module)
        {
        }

        /// <summary>
        /// 中止
        /// </summary>
        public void Abort()
        {
            Runner.Stop("Manual Stop");
        }
        /// <summary>
        /// 监控
        /// </summary>
        /// <returns></returns>
        public RState Monitor()
        {
            Runner.Run(HomeStep.DualPufHome, HomeDualPuf, _delay_1ms)
                .WaitWithStopCondition(HomeStep.DualPufHomeWait, CheckHomeDualPufStatus, CheckHomeDualPufStopStatus)
                .Run(HomeStep.LoaderHome, HomeLoaderEntity, _delay_1ms)
                .WaitWithStopCondition(HomeStep.LoaderHomeWait, CheckHomeLoaderStatus, CheckHomeLoaderStopStatus)
                .Run(HomeStep.LoaderTransporterHome, HomeLoaderTransporterEntity, _delay_1ms)
                .WaitWithStopCondition(HomeStep.LoaderTransporterHomeWait, CheckHomeLoaderTransporterStatus, CheckHomeLoaderTransporterStopStatus)
                .Run(HomeStep.ProcessTransporterHome, HomeProcessTransporterEntity, _delay_1ms)
                .WaitWithStopCondition(HomeStep.ProcessTransporterHomeWait, CheckHomeProcessTransporterStatus, CheckHomeProcessTransporterStopStatus)
                .End(HomeStep.End, NullFun, _delay_1ms);
            return Runner.Status;
        }
        /// <summary>
        /// Home Dual Puf
        /// </summary>
        /// <returns></returns>
        private bool HomeDualPuf()
        {
            if(ModuleHelper.IsInstalled(ModuleName.PUF1))
            {
                if(_puf1Entity.Invoke("HomeAll")==(int)FSM_MSG.ALARM)
                {
                    return false;
                }
            }
            if(ModuleHelper.IsInstalled(ModuleName.PUF2))
            {
                if(_puf2Entity.Invoke("HomeAll")==(int)FSM_MSG.ALARM)
                {
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 检验dual puf home情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeDualPufStatus()
        {
            bool puf1Result = true;
            if(ModuleHelper.IsInstalled(ModuleName.PUF1))
            {
                puf1Result= _puf1Entity.IsIdle;
            }
            bool puf2Result = true;
            if(ModuleHelper.IsInstalled(ModuleName.PUF2))
            { 
                puf2Result= _puf2Entity.IsIdle;
            }
            return puf1Result && puf2Result;
        }

        /// <summary>
        /// 检验dual puf home失败情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeDualPufStopStatus()
        {
            bool puf1Result = false;
            if (ModuleHelper.IsInstalled(ModuleName.PUF1))
            {
                puf1Result = _puf1Entity.State == (int)PUFSTATE.Error;
            }
            bool puf2Result = false;
            if (ModuleHelper.IsInstalled(ModuleName.PUF2))
            {
                puf2Result = _puf2Entity.State == (int)PUFSTATE.Error;
            }
            return puf1Result && puf2Result;
        }
        /// <summary>
        /// Home Loader
        /// </summary>
        /// <returns></returns>
        private bool HomeLoaderEntity()
        {
            if (ModuleHelper.IsInstalled(ModuleName.Loader1))
            {
                if (_loaderEntity.Invoke("HomeAll") == (int)FSM_MSG.ALARM)
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 检验Loader home情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeLoaderStatus()
        {
            bool result = true;
            if (ModuleHelper.IsInstalled(ModuleName.Loader1))
            {
                result = _loaderEntity.IsIdle;
            }
            return result;
        }

        /// <summary>
        /// 检验Loader home失败情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeLoaderStopStatus()
        {
            bool result = false;
            if (ModuleHelper.IsInstalled(ModuleName.Loader1))
            {
                result = _loaderEntity.State == (int)LOADERSTATE.Error;
            }
            return result;
        }


        /// <summary>
        /// Home LoaderTransporter
        /// </summary>
        /// <returns></returns>
        private bool HomeLoaderTransporterEntity()
        {
            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
            {
                if (_loaderTransporterEntity.Invoke("HomeAll") == (int)FSM_MSG.ALARM)
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 检验LoaderTransporter home情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeLoaderTransporterStatus()
        {
            bool result = true;
            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
            {
                result = _loaderTransporterEntity.IsIdle;
            }
            return result;
        }

        /// <summary>
        /// 检验Loader home失败情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeLoaderTransporterStopStatus()
        {
            bool result = false;
            if (ModuleHelper.IsInstalled(ModuleName.Transporter2))
            {
                result = _loaderTransporterEntity.State == (int)TransporterState.Error;
            }
            return result;
        }

        /// <summary>
        /// Home ProcessTransporter
        /// </summary>
        /// <returns></returns>
        private bool HomeProcessTransporterEntity()
        {
            if (ModuleHelper.IsInstalled(ModuleName.Transporter1))
            {
                if (_processTransporterEntity.Invoke("HomeAll") == (int)FSM_MSG.ALARM)
                {
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 检验LoaderTransporter home情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeProcessTransporterStatus()
        {
            bool result = true;
            if (ModuleHelper.IsInstalled(ModuleName.Transporter1))
            {
                result = _processTransporterEntity.IsIdle;
            }
            return result;
        }

        /// <summary>
        /// 检验Loader home失败情况
        /// </summary>
        /// <returns></returns>
        private bool CheckHomeProcessTransporterStopStatus()
        {
            bool result = false;
            if (ModuleHelper.IsInstalled(ModuleName.Transporter1))
            {
                result = _processTransporterEntity.State == (int)TransporterState.Error;
            }
            return result;
        }

        public RState Start(params object[] objs)
        {
            _puf1Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF1.ToString());
            _puf2Entity = Singleton<RouteManager>.Instance.GetModule<PUFEntity>(ModuleName.PUF2.ToString());
            _loaderEntity = Singleton<RouteManager>.Instance.GetModule<LoaderEntity>(ModuleName.Loader1.ToString());
            _loaderTransporterEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter2.ToString());
            _processTransporterEntity = Singleton<RouteManager>.Instance.GetModule<TransporterEntity>(ModuleName.Transporter1.ToString());
            return Runner.Start("System","System Home All");
        }
    }
}