using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

namespace BRS.Common.Model.Helper
{
    public static class EnumHelper
    {
        static int ShijiaoPostion1 = 0;
        static int ShijiaoPostion2 = 0;
        static int ShijiaoPostion3 = 0;
        public struct MyPoint
        {
            public double dX;
            public double dY;
        }
        public struct Corner
        {
            public MyPoint LU;
            public MyPoint RU;
            public MyPoint LD;
            public MyPoint RD;

        }
        /// <summary>
        /// 根据枚举的代码名称获取枚举列表信息
        /// </summary>
        /// <param name="enumName"></param>
        /// <returns></returns>
        public static List<dynamic> GetEnumListByName(string enumName, string assemblyName = "Common.Model.Helper.EnumHelper+")
        {
            List<dynamic> list = new List<dynamic>();

            string fullName = assemblyName + enumName;

            Type t = typeof(EnumHelper).Assembly.GetType(fullName);

            t.GetEnumNames().ToList().ForEach(e =>
            {
                int value = Convert.ToInt32(Enum.Parse(t, e));
                string desc = ((Enum)Enum.Parse(t, e)).GetEnumDescription();
                var item = new { Value = value, Desc = desc, Code = e };
                list.Add(item);
            });

            return list;
        }

        /// <summary>
        /// 获取枚举的列表信息,一般供下拉列表使用
        /// </summary>
        /// <param name="enumType">枚举类型</param>
        /// <returns>Desc:中文描述 Value:整形值 Code:枚举值</returns>
        public static List<dynamic> GetEnumListByType(Type enumType)
        {
            List<dynamic> list = new List<dynamic>();

            enumType.GetEnumNames().ToList().ForEach(e =>
            {
                int value = Convert.ToInt32(Enum.Parse(enumType, e));
                string desc = ((Enum)Enum.Parse(enumType, e)).GetEnumDescription();
                var item = new { Value = value, Desc = desc, Code = e };
                list.Add(item);
            });

            return list;
        }

        /// <summary>
        /// 获取具体某一枚举的中文描述
        /// </summary>
        /// <param name="enumObj"></param>
        /// <returns></returns>
        public static string GetEnumDescription(this Enum enumObj)
        {
            Type t = enumObj.GetType();
            FieldInfo f = t.GetField(enumObj.ToString());
            if (f == null)
            {
                return enumObj.ToString();
            }
            DescriptionAttribute attr = f.GetCustomAttribute<DescriptionAttribute>();
            if (attr != null)
            {
                return attr.Description;
            }
            else
            {
                return enumObj.ToString();
            }
        }

        public static System.Windows.Media.Color GetEnumSelectedMediaColor(this Enum enumObj)
        {
            Type t = enumObj.GetType();
            FieldInfo f = t.GetField(enumObj.ToString());

            ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
            if (attr != null)
            {
                var prop = typeof(System.Windows.Media.Colors).GetProperties().FirstOrDefault(p => p.Name == attr.SelectedColor);
                if (prop != null)
                {
                    return (System.Windows.Media.Color)prop.GetValue(null);
                }
            }
            return System.Windows.Media.Colors.Transparent;
        }

        public static System.Drawing.Color GetEnumSelectedColor(this Enum enumObj)
        {
            Type t = enumObj.GetType();
            FieldInfo f = t.GetField(enumObj.ToString());

            ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
            if (attr != null)
            {
                return System.Drawing.Color.FromName(attr.SelectedColor);
            }
            else
            {
                return System.Drawing.Color.Transparent;
            }
        }

        public static System.Drawing.Color GetEnumSelectedFontColor(this Enum enumObj)
        {
            Type t = enumObj.GetType();
            FieldInfo f = t.GetField(enumObj.ToString());

            var attr = f.GetCustomAttribute<FontColorSelectAttribute>();
            if (attr != null)
            {
                return System.Drawing.Color.FromName(attr.SelectedColor);
            }
            else
            {
                return System.Drawing.Color.Transparent;
            }
        }

        public static string GetEnumSelectedColorString(this Enum enumObj)
        {
            Type t = enumObj.GetType();
            FieldInfo f = t.GetField(enumObj.ToString());

            ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
            if (attr != null)
            {
                return attr.SelectedColor;
            }
            else
            {
                return "Transparent";
            }
        }


        /// <summary>
        /// 当枚举牵涉到状态变换,检查现状态是否满足待转换的状态的前置状态要求
        /// </summary>
        /// <param name="stateToBe"></param>
        /// <param name="currentState"></param>
        /// <returns></returns>
        public static bool CheckPreStateValid(this Enum stateToBe, int currentState)
        {
            Type t = stateToBe.GetType();
            FieldInfo f = t.GetField(stateToBe.ToString());

            PreStateAttribute attr = f.GetCustomAttribute<PreStateAttribute>();
            if (attr == null)
            {
                return true;
            }
            else
            {
                return attr.CheckPreStateValid(currentState);
            }
        }

        /// <summary>
        /// 设备状态定义
        /// 未初始化和异常状态无前置状态要求
        /// 初始化操作前置状态必须是未初始化、关闭状态和异常状态
        /// 打开前置必须是初始化和暂停
        /// 关闭前置必须是打开和暂停和异常
        /// 暂停前置必须是打开
        /// </summary>
        public enum DeviceState
        {
            TBD = -1,

            [ColorSelect("Gray")]
            [FontColorSelect("Black")]
            [Description("未初始化")]
            DSUninit = 1,

            [ColorSelect("Gold")]
            [FontColorSelect("White")]
            [PreState(1 + 2 + 4 + 8 + 32)]
            [Description("初始化")]
            DSInit = 2,

            [ColorSelect("Lime")]
            [FontColorSelect("Black")]
            [PreState(2 + 4 + 16)]
            [Description("运行中")]
            DSOpen = 4,

            [ColorSelect("Gray")]
            [FontColorSelect("White")]
            [PreState(1 + 4 + 8 + 16 + 32)]
            [Description("关闭")]
            DSClose = 8,

            [ColorSelect("Gold")]
            [FontColorSelect("White")]
            [PreState(4 + 16)]
            [Description("暂停")]
            DSPause = 16,

            [ColorSelect("Red")]
            [FontColorSelect("White")]
            [Description("异常")]
            DSExcept = 32
        }

        /// <summary>
        /// 工序状态
        /// </summary>
        public enum RunState
        {
            [ColorSelect("Gold")]
            [Description("空闲")]
            Idle = 1,

            [ColorSelect("Lime")]
            [Description("运行中")]
            Running = 2,

            [ColorSelect("Gray")]
            [Description("停止")]
            Stop = 3,

            [ColorSelect("Red")]
            [Description("宕机")]
            Down = 99,
        }



        [Flags]
        public enum DeviceAttributeType
        {
            [Description("设备驱动")]
            Device = 1,

            [Description("初始配置")]
            InitialConfig = 2,


            [Description("操作配置")]
            OperationConfig = 4,


            [Description("设备配置")]
            DeviceConfig = 8,


            [Description("输入配置")]
            InputConfig = 16,

            [Description("初始配置控件")]
            InitialConfigCtrl = 32,


            [Description("操作配置控件")]
            OperationConfigCtrl = 64,


            [Description("设备配置控件")]
            DeviceConfigCtrl = 128,


            [Description("输入配置控件")]
            InputConfigCtrl = 256,


            [Description("运行控件")]
            RunCtrl = 512,

            [Description("操作配置面板")]
            OperationConfigPanel = 1024,
        }

        public enum EnableState
        {
            [Description("启用")]
            Enabled = 0,
            [Description("禁用")]
            Disabled = 1,
        }

        public enum EnableStateFilter
        {
            [Description("全部")]
            All = -1,
            [Description("启用")]
            Enabled = 0,
            [Description("禁用")]
            Disabled = 1,
        }

        public enum OutputResult
        {
            [Description("OK")]
            OK = 1,
            [Description("NG")]
            NG = 2,
        }

        /// <summary>
        /// PLC项目的值的类型
        /// </summary>
        public enum PLCItemType
        {
            [Description("布尔类型")]
            Bool = 0,
            [Description("整型")]
            Integer = 1,
            [Description("字符串型")]
            String = 2,
        }

        /// <summary>
        /// 对PLC项目的操作类型
        /// </summary>
        public enum PLCOpType
        {
            [Description("读取")]
            Read = 1,
            [Description("写入")]
            Write = 2,
            [Description("监控")]
            Monitor = 4,

            /// <summary>
            /// 报警监控 1+8
            /// </summary>
            [Description("报警监控")]
            WarningMonitor = 9,

            /// <summary>
            /// CT监控 1+16
            /// </summary>
            [Description("CT监控")]
            CTMonitor = 17,
        }

        /// <summary>
        /// 相机运行模式
        /// </summary>
        public enum CameraOpMode
        {
            [Description("单次拍照")]
            SingleSnapShot = 1,
            [Description("连续模式")]
            ContinuousMode = 2,
        }

        /// <summary>
        /// 日志类型
        /// </summary>
        public enum LogType
        {
            [Description("警告信息")]
            Exception_Warning = 1,
            [Description("错误信息")]
            Exception_Error = 2,
            [Description("致命信息")]
            Exception_Fatal = 3,

            [Description("设备信息")]
            Info_Device = 11,
            [Description("工序信息")]
            Info_Process = 12,
            [Description("操作信息")]
            Info_Operation = 13,

            [Description("用户操作信息")]
            User_Operation = 21,

            [Description("测量结果")]
            MeasureResult = 31,
        }

        //public enum CameraDriverType
        //{
        //    Halcon,
        //    //HalconPlugIn,
        //    Hik,
        //}

        //public enum ImageType
        //{
        //    Bmp,
        //    Png,
        //    Jpeg,
        //}

        //public enum ReplyValue
        //{
        //    OK = 1,
        //    NG = -1,
        //    IGNORE = -999,
        //}

        public enum PriorityDirection
        {
            X,
            Y,
        }

        public enum ElementState
        {
            New = 1,
            MouseHover = 2,
            MouseInSide = 3,
            Selected = 4,
            Moving = 5,
            Editing = 6,

            Normal = 11,

            Measuring = 21,
            MeasureDoneOK = 22,
            MeasureDoneNG = 23,

            CanStretchLeft = 41,
            CanStretchRight = 42,
            CanStretchTop = 43,
            CanStretchBottom = 44,

            CanStretchLeftUpperCorner = 45,
            CanStretchLeftLowerCorner = 46,
            CanStretchRightUpperCorner = 47,
            CanStretchRightLowerCorner = 48,

            StretchingLeft = 31,
            StretchingRight = 32,
            StretchingTop = 33,
            StretchingBottom = 34,

            StretchingLeftUpperCorner = 35,
            StretchingLeftLowerCorner = 36,
            StretchingRightUpperCorner = 37,
            StretchingRightLowerCorner = 38,
        }

        public enum MouseState
        {
            Normal = 1,
            HoverElement = 2,
            InSideElement = 3,

            MoveElement = 4,

            StretchingLeft = 11,
            StretchingRight = 12,
            StretchingTop = 13,
            StretchingBottom = 14,

            StretchingLeftUpperCorner = 15,
            StretchingLeftLowerCorner = 16,
            StretchingRightUpperCorner = 17,
            StretchingRightLowerCorner = 18,

            New = 21,
            Editing = 22,
            //SelectedElement = 23,

            MovingAll = 31,

            SelectionZone = 41,
            SelectionZoneDoing = 42,
        }

        public enum RunMode
        {
            [Description("调试模式")]
            DebugMode = 0,

            [Description("正常运行模式")]
            NormalMode = 1,

            [Description("模拟模式")]
            DemoMode = 2,
        }

        public enum MoveType
        {
            [Description("绝对运动")]
            AbsoluteMove = 1,
            [Description("机器人坐标系相对运动")]
            RobotRelativeMove = 2,
            [Description("相对某个基准点位的相对运动")]
            BasedPointRelativeMove = 3,
            [Description("回原点")]
            Origin = 4,
            [Description("左侧姿势")]
            LeftPose = 6,
            [Description("右侧姿势")]
            RightPose = 5,
            [Description("前侧姿势")]
            FrontPose = 7,
            [Description("相机坐标系相对运动")]
            CameraRelativeMove = 12,
        }

        /// <summary>
        /// 马达/运动板卡运行模式
        /// </summary>
        public enum MotionMode
        {
            /// <summary>
            /// 普通点位运动
            /// </summary>
            [Description("普通点位运动")]
            P2P = 1,

            /// <summary>
            /// 找正限位运动
            /// </summary>
            [Description("找正限位运动")]
            FindPositive = 4,

            /// <summary>
            /// 离开正限位
            /// </summary>
            [Description("离开正限位")]
            LeavePositive = 5,

            /// <summary>
            /// 找负限位运动
            /// </summary>
            [Description("找负限位运动")]
            FindNegative = 6,

            /// <summary>
            /// 离开负限位
            /// </summary>
            [Description("离开负限位")]
            LeaveNegative = 7,

            /// <summary>
            /// 找原点运动
            /// </summary>
            [Description("回原点运动")]
            GoHome = 8,

            /// <summary>
            /// Jog模式
            /// </summary>
            [Description("Jog模式")]
            Jog = 9,

            ///// <summary>
            ///// 读数头找原点方式
            ///// </summary>
            //[Description("找原点inde")]
            //FindOriIndex = 10,

            ///// <summary>
            ///// 插补模式
            ///// </summary>
            //[Description("插补模式")]
            //Coordinate = 11
        }

        /// <summary>
        /// IO预定义类型 主要针对输出
        /// </summary>
        public enum IOPrestatement
        {
            [Description("自定义")]
            Customized = 0,

            [Description("指示灯-黄")]
            Light_Yellow = 1,
            [Description("指示灯-绿")]
            Light_Green = 2,
            [Description("指示灯-红")]
            Light_Red = 3,
            [Description("蜂鸣器")]
            Beep = 4,
            [Description("照明灯")]
            Light = 5,

            [Description("急停")]
            EmergencyStop = 99,
        }

        /// <summary>
        /// GTS运动板卡控制返回控制码
        /// </summary>
        public enum GTSRetCode
        {
            [Description("指令执行成功")]
            GRCRunOK = 0,         // 指令执行成功
            [Description("指令执行错误")]
            GRCRunErr = 1,                          // 指令执行错误
            [Description("icense不支持")]
            GRCNotSupport = 2,                      // icense不支持
            [Description("指令参数错误")]
            GRCInvalidParam = 7,                    // 指令参数错误
            [Description("主机和运动控制器通讯失败")]
            GRCCommErr = -1,                         // 主机和运动控制器通讯失败
            [Description("打开控制器失败")]
            GRCOpenErr = -6,                         // 打开控制器失败
            [Description("运动控制器没有响应")]
            GRCNotAck = -7                           // 运动控制器没有响应
        }

        /// <summary>
        /// 运动板卡 IO 类型(IN OUT)
        /// </summary>
        public enum IOType
        {
            [Description("INPUT")]
            INPUT = 0,
            [Description("OUTPUT")]
            OUTPUT = 1
        }

        public enum IOValue
        {
            [Description("关闭")]
            FALSE = 0,
            [Description("开启")]
            TRUE = 1,
            [Description("反转")]
            REVERSE = 2,
        }

        /// <summary>
        /// PubSubCenter事件中心的消息类型
        /// </summary>
        public enum PubSubCenterMessageType
        {
            /// <summary>
            /// 运行界面更新产品下拉
            /// </summary>
            [Description("更新产品下拉")]
            UpdateProductionCodes,

            /// <summary>
            /// 流程是否关闭
            /// </summary>
            [Description("流程是否打开")]
            IsProcessOpened,

            /// <summary>
            /// 清除数据
            /// </summary>
            [Description("清除数据")]
            ClearData,
            /// <summary>
            /// 更新批次信息
            /// </summary>
            [Description("更新批次信息")]
            UpdateBatchNO,
            /// <summary>
            /// 请求批次信息
            /// </summary>
            [Description("更新批次信息")]
            RequestBatchNO,
        }

        public enum MachineState
        {
            Unknown = 0,
            Ready = 1,
            Running = 2,
            Alarm = 3,
            Pause = 4,
            Resetting = 5,
            Closing = 6,
            ClearProduct = 7,
            //等待
            Waiting=8,
        }

        public enum WhoolSize
        {
           Size17=0,
           Size16,
           Size18,
           
        }



        public enum MachineStateStep
        {
            Unknown = 0,
            Ready ,//上电就绪
            
            inflation,//充气气
            Running ,//硫化
            Bleeding,//放气
            Alarm ,
            Pause ,
            Resetting ,
            Closing ,
            ClearProduct ,
        }



        public enum RobotsStatus
        {
            Unknown = 0,
            Inplace ,
            Claming,
            Relasing,
            Moving ,
            Wating ,
            Pweroff,
            Reset ,
           
        }
        public enum ProcessStatus
        {
            Unknown = 0,
            /// <summary>
            /// 初始化点
            /// </summary>
            Init,
            
            MesureingInit,
            MesureingInitPLC,
            Mesureing ,
            MesureingPLC,
            Claim ,
            ClaimPLC,
            Runing ,
            RunFinish,
            Loosen,
            LoosenPLC,
            TakeOffMove,
            TakeOffMovePLC,
            TakeOffMovePLC_2,
            TakeOff,/// <summary>
                    /// 取出轮胎
                    /// </summary>
                    /// 
            TakeOffCaim,
            TakeOffPLC,
            TakeOffPoint,
            TakeOffPointCaim,
            TakeOffPointCaimFlag,
            TakeOffWhool,
            Resetting ,
            Closing ,
            ClearProduct ,
        }


        public enum ResultState
        {
            [Description("NA")]
            NA = -5,
            //[Description("尺寸NG")]
            //SizeNG = -4,
            [Description("检测NG")]
            NG = -1,
            //[Description("A类NG")]
            //A_NG = -3,
            //[Description("C类NG")]
            //C_NG = -2,
            //[Description("B类NG")]
            //B_NG = -1,

            [Description("OK")]
            OK = 1,

        }



        public enum HikCameraType
        {
            [Description("HikCamera-Gige")]
            Gige = 0,
            [Description("HikCamera-USB")]
            USB = 1
        }

        /// <summary>
        /// 光源操作
        /// </summary>
        public enum LightOperation
        {
            [Description("打开")]
            Open = 1,
            [Description("关闭")]
            Close = 2,
            [Description("写入")]
            Write = 3,
            [Description("读取")]
            Read = 4,
            [Description("频闪")]
            Flash = 5,
        }

        /// <summary>
        /// 监听反馈数据值
        /// </summary>
        public enum ReturnValue
        {
            OKVALUE = 1,
            NGVALUE = -1,
            EXCEPTIONVALUE = -2,
            UNAUTHORIZATION = -10,
            IGNORE = -999,
        }

        public enum LogLevel
        {
            [Description("辅助")]
            [ColorSelect("White")]
            [FontColorSelect("Blue")]
            Assist = 1,
            [Description("详细")]
            [ColorSelect("White")]
            [FontColorSelect("Green")]
            Detail = 2,
            [Description("信息")]
            [ColorSelect("White")]
            [FontColorSelect("Dark")]
            Information = 3,
            [Description("动作")]
            [ColorSelect("DarkGreen")]
            [FontColorSelect("Yellow")]
            Action = 4,


            [Description("错误")]
            [ColorSelect("Orange")]
            [FontColorSelect("White")]
            Error = 5,


            [Description("警报")]
            [ColorSelect("Brown")]
            [FontColorSelect("White")]
            Warning = 6,


            [Description("异常")]
            [ColorSelect("Red")]
            [FontColorSelect("White")]
            Exception = 7,
        }


        public enum DetectionDeviceTypeDef
        {
            [Description("CPU")]
            CPU = 0,

            [Description("GPU")]
            GPU,

            [Description("VPU")]
            VPU,
        }



        //public enum DetectImageFormat
        //{
        //    [Description("所有格式")]
        //    ALL = 0,
        //    [Description("JPEG")]
        //    JPEG = 1,
        //    [Description("PNG")]
        //    PNG = 2,
        //    [Description("TIFF")]
        //    TIFF = 3,
        //}

    }
}