using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using Aitex.Core.RT.SCCore;
using Aitex.Core.RT.Log;
using MECF.Framework.Common.ToolLayout;
namespace MECF.Framework.Common.Equipment
{
    /// 
    /// 在框架中,Module指具备放置Wafer的单元
    /// 
    [DataContract]
    [Serializable]
    public enum ModuleName
    {
        [EnumMember]
        Unknown=9999,
        [EnumMember]
        System = 0,
        [EnumMember]
        LP1,
        [EnumMember]
        LP2,
        [EnumMember]
        LP3,
        [EnumMember]
        LP4,
        [EnumMember]
        LP5,
        [EnumMember]
        LP6,
        [EnumMember]
        LP7,
        [EnumMember]
        LP8,
        [EnumMember]
        LP9,
        [EnumMember]
        LP10,
        //robot modules
        //[EnumMember]
        //Robot,
        [EnumMember]
        VaccumRobot,
        [EnumMember]
        LoadRobot,
        [EnumMember]
        EfemRobot,
        //[EnumMember]
        //TMRobot,
        //upenders
        [EnumMember]
        Upender,
        //efem
        [EnumMember]
        EFEM,
        //aligners
        [EnumMember]
        Aligner,
        [EnumMember]
        Aligner1,
        [EnumMember]
        Aligner2,
        [EnumMember]
        Robot,
 
        [EnumMember]
        PMA,
        [EnumMember]
        PMB, 
        [EnumMember]
        PMC,
        [EnumMember]
        PMD,
        [EnumMember]
        PME,
        [EnumMember]
        PMF,
        [EnumMember]
        VPA,
        [EnumMember]
        SRD1,
        [EnumMember]
        SRD2,
        [EnumMember]
        PUF1,
        [EnumMember]
        PUF2,
        [EnumMember]
        Dummy1,
        [EnumMember]
        Dummy2,
        [EnumMember]
        Loader1,
        [EnumMember]
        Dryer1,
        [EnumMember]
        Dryer2,
        [EnumMember]
        Dryer3,
        [EnumMember]
        Prewet1,
        [EnumMember]
        Rinse1,
        [EnumMember]
        Rinse2,
        [EnumMember]
        Rinse3,
        [EnumMember]
        Rinse4,
        [EnumMember]
        Rinse5,
        [EnumMember]
        Rinse6,
        [EnumMember]
        Metal1,
        [EnumMember]
        Metal2,
        [EnumMember]
        Metal3,
        [EnumMember]
        Metal4,
        [EnumMember]
        Metal5,
        [EnumMember]
        Metal6,
        [EnumMember]
        Metal7,
        [EnumMember]
        Metal8,
        [EnumMember]
        Metal9,
        [EnumMember]
        Metal10,
        [EnumMember]
        Metal11,
        [EnumMember]
        Metal12,
        [EnumMember]
        Metal13,
        [EnumMember]
        Metal14,
        [EnumMember]
        Metal15,
        [EnumMember]
        Metal16,
        [EnumMember]
        Linmot,
        [EnumMember]
        Transporter1,
        [EnumMember]
        Transporter2,
        [EnumMember]
        Buffer1,
        [EnumMember]
        Buffer2,
        [EnumMember]
        Buffer3,
        [EnumMember]
        Buffer4,
        [EnumMember]
        Buffer5,
        [EnumMember]
        Buffer6,
        [EnumMember]
        Buffer7,
        [EnumMember]
        Buffer8,
        [EnumMember]
        Buffer9,
        [EnumMember]
        Buffer10,
        [EnumMember]
        Buffer11,
        [EnumMember]
        Buffer12,
        [EnumMember]
        Buffer13,
        [EnumMember]
        Buffer14,
        [EnumMember]
        Buffer15,
        [EnumMember]
        Buffer16,
        [EnumMember]
        Buffer17,
        [EnumMember]
        Buffer18,
        [EnumMember]
        Buffer19,
        [EnumMember]
        Buffer20,
        [EnumMember]
        Reservoir1,
        [EnumMember]
        Reservoir2,
        [EnumMember]
        Reservoir3,
        [EnumMember]
        Reservoir4,
        [EnumMember]
        Reservoir5,
        [EnumMember]
        VPWMain1,
        [EnumMember]
        VPW1,
        [EnumMember]
        VPW2,
        [EnumMember]
        VPW3,
        [EnumMember]
        VPW4,
        [EnumMember]
        VPW5,
        [EnumMember]
        VPW6,
        [EnumMember]
        VPW7,
        [EnumMember]
        VPW8,
        [EnumMember]
        VPW9,
        [EnumMember]
        VPW10
    }
    /// 
    /// 模块类型
    /// 
    public enum ModuleType
    {
        None,
        LoadPort,
        EfemRobot,
        Aligner,
        SRD,
        PUF,
        Loader,
        Buffer,
        Dryer,
        Rinse,
        Prewet,
        Metal,
        Dummy,
        Transporter,
        Reservoir,
        VpwMain,
        VPW
    }
    public static class ModuleHelper
    {
        public static bool IsPrewet(ModuleName unit)
        {
            return unit == ModuleName.Prewet1;
        }
        public static bool IsSRD(ModuleName unit)
        {
            return unit == ModuleName.SRD1 || unit == ModuleName.SRD2;
        }
        public static bool IsPUF(ModuleName unit)
        {
            return unit == ModuleName.PUF1 || unit == ModuleName.PUF2;
        }
        public static bool IsMetal(ModuleName unit)
        {
            return (int)unit >= (int)ModuleName.Metal1 && (int)unit <= (int)ModuleName.Metal16;
        }
        public static bool IsDry(ModuleName unit)
        {
            return (int)unit >= (int)ModuleName.Dryer1 && (int)unit <= (int)ModuleName.Dryer3;
        }
        public static bool IsReservoir(ModuleName unit)
        {
            return (int)unit >= (int)ModuleName.Reservoir1 && (int)unit <= (int)ModuleName.Reservoir5;
        }
        public static bool IsRinse(ModuleName unit)
        {
            return (int)unit >= (int)ModuleName.Rinse1 && (int)unit <= (int)ModuleName.Rinse6;
        }
        public static bool IsBuffer(ModuleName unit)
        {
            return (int)unit>=(int)ModuleName.Buffer1&&(int)(unit)<=(int)ModuleName.Buffer19;
        }
        public static bool IsVPWCell(ModuleName unit)
        {
            return (int)unit >= (int)ModuleName.VPW1 && (int)(unit) <= (int)ModuleName.VPW10;
        }
        public static bool IsLoadPort(ModuleName unit)
        {
            return unit == ModuleName.LP1
                   || unit == ModuleName.LP2
                   || unit == ModuleName.LP3
                   || unit == ModuleName.LP4
                   || unit == ModuleName.LP5
                   || unit == ModuleName.LP6
                   || unit == ModuleName.LP7
                   || unit == ModuleName.LP8
                   || unit == ModuleName.LP9
                   || unit == ModuleName.LP10;
        }
        public static bool IsDummy(ModuleName unit)
        {
            return unit == ModuleName.Dummy1 || unit == ModuleName.Dummy2;
        }
        public static bool IsAligner(ModuleName unit)
        {
            return unit == ModuleName.Aligner || unit == ModuleName.Aligner1 || unit == ModuleName.Aligner2  ;
        }
        public static bool IsEFEMRobot(ModuleName unit)
        {
            return unit == ModuleName.EfemRobot;
        }
        public static bool IsVPA(ModuleName unit)
        {
            return unit == ModuleName.VPA;
        }
        public static string GetAbbr(ModuleName module)
        {
            switch (module)
            {
                case ModuleName.Aligner: return "PA";
                case ModuleName.Robot: return "RB";
                default: return module.ToString();
            }
        }
        public static ModuleName Converter(string module)
        {
            return (ModuleName) Enum.Parse(typeof(ModuleName), module);
        }
        /// 
        /// 
        /// 
        /// 0 based
        /// 
        public static ModuleName GetLoadPort(int index)
        {
            ModuleName[] lps = new ModuleName[]
            {
                ModuleName.LP1, ModuleName.LP2, ModuleName.LP3, ModuleName.LP4, ModuleName.LP5,
                ModuleName.LP6, ModuleName.LP7, ModuleName.LP8, ModuleName.LP9, ModuleName.LP10,
            };
            return lps[index];
        }
        private static List _lstModules = new List();
        private static readonly object _lock = new object();
        public static bool IsInstalled(ModuleName module)
        {
            //if (_lstModules.Count == 0)
            //{
            //    LoadModules();
            //}
            //return _lstModules.Contains(module);
            return ToolLayoutConfigManager.Instance.IsInstalled(module);
        }
        public static void LoadModules()
        {
            lock (_lock)
            {
                try
                {
                    string moduleString = SC.GetStringValue("System.InstalledModules");
                    var modules = moduleString.Split(',');
                    foreach (var mod in modules)
                    {
                        var module = Converter(mod.Trim());
                        _lstModules.Add(module);
                    }
                }
                catch (Exception e)
                {
                    LOG.WriteExeption("Loading intalled module error, please check the config item: System.InstalledModules", e);
                }
            }
        }
    }
    public class ModuleNameString
    {
        public const string System = "System";
        public const string LDULD = "LDULD";
        public const string BufferOut = "BufferOut";
        public const string BufferIn = "BufferIn";
        public const string Dryer = "Dryer";
        public const string QDR = "QDR";
        public const string Robot = "Robot";
        public const string Handler = "Handler";
        public static ModuleName ToEnum(string value)
        {
            return (ModuleName)Enum.Parse(typeof(ModuleName), value, true);
        }
    }
}