using Aitex.Core.Common;
using Aitex.Core.RT.Fsm;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.Common.ToolLayout;
using MECF.Framework.Common.WaferHolder;
using CyberX8_Core;
using CyberX8_RT.Modules.Dummy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CyberX8_RT.Modules.Dryer;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.Util;
namespace CyberX8_RT.Modules.Buffer
{
    public class BufferEntity : Entity, IEntity, IModuleEntity
    {
        public enum MSG
        {
            Home
        }
        #region 属性
        public ModuleName Module { get; private set; }
        /// 
        /// 初始化状态
        /// 
        public bool IsInit
        {
            get { return false; }
        }
        /// 
        /// 空闲状态
        /// 
        public bool IsIdle
        {
            get
            {
                return true;
            }
        }
        /// 
        /// 是否发生错误
        /// 
        public bool IsError
        {
            get { return false; }
        }
        /// 
        /// 是否正在作业
        /// 
        public bool IsBusy
        {
            get { return false; }
        }
        public bool IsAuto { get; } = true;
        /// 
        /// 是否禁用
        /// 
        public bool IsDisable { get; internal set; }
        /// 
        /// 是否为工程模式
        /// 
        public bool IsEngineering { get; } = false;
        /// 
        /// 是否为产品模式
        /// 
        public bool IsProduction { get; } = true;
        /// 
        /// WaferHolder信息
        /// 
        public WaferHolderInfo WaferHolderInfo { get { return WaferHolderManager.Instance.GetWaferHolder(Module.ToString()); } }
        #endregion
        /// 
        /// 构造函数
        /// 
        /// 
        public BufferEntity(ModuleName module)
        {
            this.Module = module;
            WaferManager.Instance.SubscribeLocation(Module, 2);
            InitializeWaferHolder();
            InitializeSvid();
        }
        /// 
        /// 初始化WaferHolder
        /// 
        private void InitializeWaferHolder()
        {
            if(WaferHolderInfo!=null)
            {
                if(!string.IsNullOrEmpty(WaferHolderInfo.WaferAId))
                {
                    if(!WaferManager.Instance.CheckHasWafer(Module,0))
                    {
                        WaferManager.Instance.CreateWafer(Module, 0, WaferStatus.Normal, (WaferSize)WaferHolderInfo.WaferSize,(WaferType)WaferHolderInfo.WaferAType);
                    }
                    WaferInfo waferInfo = WaferManager.Instance.GetWafer(Module, 0);
                    waferInfo.WaferOrigin = WaferHolderInfo.WaferAId;
                    waferInfo.WaferID = WaferHolderInfo.WaferAId;
                    waferInfo.OrginalWaferHolder = WaferHolderInfo.Id;
                }
                if(!string.IsNullOrEmpty(WaferHolderInfo.WaferBId))
                {
                    if(!WaferManager.Instance.CheckHasWafer(Module,1))
                    {
                        WaferManager.Instance.CreateWafer(Module, 1, WaferStatus.Normal, (WaferSize)WaferHolderInfo.WaferSize, (WaferType)WaferHolderInfo.WaferBType);
                    }
                    WaferInfo waferInfo = WaferManager.Instance.GetWafer(Module, 1);
                    waferInfo.WaferOrigin = WaferHolderInfo.WaferBId;
                    waferInfo.WaferID = WaferHolderInfo.WaferBId;
                    waferInfo.OrginalWaferHolder=WaferHolderInfo.Id;
                }
            }
        }
        /// 
        /// 初始化SVID
        /// 
        private void InitializeSvid()
        {
            DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId , SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
        }
        public bool Check(int msg, out string reason, params object[] args)
        {
            reason = "";
            return false;
        }
        public bool CheckAcked(int msg)
        {
            return false;
        }
        public int Invoke(string function, params object[] args)
        {
            switch (function)
            {
                case "HomeAll":
                    return (int)MSG.Home;
            }
            return (int)FSM_MSG.NONE;
        }
    }
}