using Aitex.Core.Common;
using Aitex.Core.Util;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using CyberX8_RT.Modules.Dummy;
using CyberX8_RT.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.WaferHolder;
using Aitex.Core.RT.Fsm;
using CyberX8_RT.Modules.Buffer;
using MECF.Framework.Common.ToolLayout;
using MECF.Framework.RT.Core.Equipments;

namespace CyberX8_RT.Dispatch
{
    public class DummyWaferManager : Singleton<DummyWaferManager>
    {
        /// <summary>
        /// 加载工序完完毕的WaferHolder
        /// </summary>
        /// <returns></returns>
        public List<WaferHolderInfo> LoadCompletedWaferHolderInfo()
        {
            List<WaferHolderInfo> waferHolderInfos = new List<WaferHolderInfo>();
            List<string> dryerModules = DryerItemManager.Instance.InstalledModules;
            foreach (string item in dryerModules)
            {
                WaferHolderInfo waferHolderInfo = WaferHolderManager.Instance.GetWaferHolder(item);
                if (waferHolderInfo == null)
                {
                    continue;
                }
                if (!Enum.TryParse(item, out ModuleName dryerModuleName))
                {
                    continue;
                }
                if (WaferHolderTaskManager.Instance.CheckWaferHolderNotExist(waferHolderInfo))
                {
                    if (WaferManager.Instance.CheckHasWafer(item, 0))
                    {
                        WaferInfo waferInfo = WaferManager.Instance.GetWafer(dryerModuleName, 0);
                        if (waferInfo != null && waferInfo.WaferType == WaferType.Production)
                        {
                            waferHolderInfos.Add(waferHolderInfo);
                            return waferHolderInfos;
                        }
                    }
                    if (WaferManager.Instance.CheckHasWafer(item, 1))
                    {
                        WaferInfo waferInfo = WaferManager.Instance.GetWafer(dryerModuleName, 1);
                        if (waferInfo != null &&waferInfo.WaferType == WaferType.Production)
                        {
                            waferHolderInfos.Add(waferHolderInfo);
                            return waferHolderInfos;
                        }
                    }
                }
            }
            List<string> installBufferModules = BufferItemManager.Instance.InstalledModules.ToList();
            foreach (string item in installBufferModules)
            {
                ModuleName moduleName=(ModuleName)Enum.Parse(typeof(ModuleName), item);
                BufferEntity bufferEntity = Singleton<RouteManager>.Instance.GetModule<BufferEntity>(item);
                if(bufferEntity==null)
                {
                    continue;
                }
                WaferHolderInfo waferHolderInfo=bufferEntity.WaferHolderInfo;
                if(waferHolderInfo==null)
                {
                    continue;
                }
                
                if(WaferManager.Instance.CheckHasWafer(item,0))
                {
                    WaferInfo waferInfo = WaferManager.Instance.GetWafer(moduleName, 0);
                    if(waferInfo!=null && waferInfo.ProcessState >= EnumWaferProcessStatus.InProcess&&waferInfo.WaferType==WaferType.Production)
                    {
                        waferHolderInfos.Add(waferHolderInfo);
                        continue;
                    }
                }
                if (WaferManager.Instance.CheckHasWafer(item, 1))
                {
                    WaferInfo waferInfo = WaferManager.Instance.GetWafer(moduleName, 1);
                    if (waferInfo != null && waferInfo.ProcessState >= EnumWaferProcessStatus.InProcess&&waferInfo.WaferType==WaferType.Production)
                    {
                        waferHolderInfos.Add(waferHolderInfo);
                    }
                }
            }
            return waferHolderInfos;
        }
        /// <summary>
        /// 通过WaferHolder加载DummyWafer
        /// </summary>
        /// <param name="waferHolderInfo"></param>
        /// <returns></returns>
        public List<WaferInfo> LoadDummyWafersByWaferHolder(WaferHolderInfo waferHolderInfo)
        {
            List<WaferInfo> waferInfos = new List<WaferInfo>();
            if(ModuleHelper.IsInstalled(ModuleName.Dummy1))
            {
                LoadDummyWaferByDummyModule(ModuleName.Dummy1,waferHolderInfo.Id, waferInfos);
            }
            if(ModuleHelper.IsInstalled(ModuleName.Dummy2))
            {
                LoadDummyWaferByDummyModule(ModuleName.Dummy2,waferHolderInfo.Id, waferInfos);
            }
            return waferInfos;
        }

        /// <summary>
        /// 通过Dummy模块加载DummyWafer
        /// </summary>
        /// <param name="moduleName"></param>
        /// <param name="orginalModuleName"></param>
        /// <param name="waferInfos"></param>
        private void LoadDummyWaferByDummyModule(ModuleName dummyModuleName,string waferHolderId,List<WaferInfo> waferInfos)
        {
            DummyEntity dummyEntity = Singleton<RouteManager>.Instance.GetModule<DummyEntity>(dummyModuleName.ToString());
            if (dummyEntity == null)
            {
                return;
            }
            for (int i = 0; i < dummyEntity.MaxSlotNumber; i++)
            {
                if (WaferManager.Instance.CheckNoWafer(dummyModuleName, i))
                {
                    continue;
                }
                WaferInfo waferInfo = WaferManager.Instance.GetWafer(dummyModuleName, i);
                if (waferInfo == null)
                {
                    continue;
                }
                if (waferInfo.OrginalWaferHolder == waferHolderId)
                {
                    waferInfos.Add(waferInfo);
                }
            }
        }        
    }
}