using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace ICSSoft.Common
{
    public static class EnumHelper
    {
        #region 获取枚举注解
        /// <summary>
        /// 判单枚举中是否包含该枚举描述
        /// </summary>
        /// <param name="enumType"></param>
        /// <param name="desc"></param>
        /// <returns></returns>
        public static bool HasDescriptions(Type enumType,string desc)
        {
            if (enumType != null && enumType.IsEnum)
            {
                FieldInfo[] fields = enumType.GetFields();

                for (int i = 1; i < fields.Length; ++i)
                {
                    //object fieldValue = Enum.Parse(enumType, fields[i].Name);
                    object[] attrs = fields[i].GetCustomAttributes(true);
                    foreach (object attr in attrs)
                    {
                        if (typeof(DescriptionAttribute).IsAssignableFrom(attr.GetType()) && ((DescriptionAttribute)attr).Description.Equals(desc))
                        {
                            return true;
                        }
                    }
                }
            }

            return false;
        }
        
        #endregion

        public static string GetDescription<Attr>(this Enum em) where Attr : AttrDescription
        {
            Type enumType = em.GetType();
            var name = Enum.GetName(enumType, em);
            if (name == null)
                return string.Empty;
            object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(Attr), false);
            if (objs == null || objs.Length == 0)
                return string.Empty;
            Attr attr = objs[0] as Attr;
            return attr.Description;
        }

        public static string GetDescription(this Enum em)
        {
            Type enumType = em.GetType();
            var name = Enum.GetName(enumType, em);
            if (name == null)
                return string.Empty;
            object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
            if (objs == null || objs.Length == 0)
                return string.Empty;
            System.ComponentModel.DescriptionAttribute attr = objs[0] as System.ComponentModel.DescriptionAttribute;
            return attr.Description;
        }
    }
    #region 用于枚举的特性类
    public class AttrDescription : Attribute
    {
        private string _showName;

        public AttrDescription(string desc)
        {
            _showName = desc;
        }

        public string Description
        {
            get
            {
                return _showName;
            }
        }
    }

    public class DBValue : AttrDescription
    {
        public DBValue(string desc)
            : base(desc)
        {

        }
    }

    //public class DescriptionEn : AttrDescription
    //{
    //    public DescriptionEn(string desc)
    //        : base(desc)
    //    {

    //    }
    //}
    #endregion
}