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

namespace IRaCIS.Core.Infrastructure.Extention
{
    public static class EnumToSelectExtension
    {
        /// <summary>
        /// 将枚举转换成字典(枚举,自定义描述)
        /// </summary>
        /// <typeparam name="TEnum"></typeparam>
        /// <param name="exceptList">需要排除的枚举</param>
        /// <returns></returns>
        public static Dictionary<object, string> ToSelect<TEnum>(  params TEnum[] exceptList) where TEnum : struct, Enum
        {
            var type = typeof(TEnum);
            var dict = new Dictionary<object, string>();
            foreach (var value in Enum.GetValues<TEnum>())
            //foreach (var value in type.GetEnumValues())
            {
                var attr = type.GetField(value.ToString())
                    .GetCustomAttribute<DescriptionAttribute>();
                if (attr is null || exceptList.Contains(value)) continue;

                var key = type.GetFields().FirstOrDefault(t=>t.Name== value.ToString()).GetRawConstantValue();
                dict[key] = attr.Description;
            }
            return dict;
        }

        /// <summary>
        /// 扩展方法,获得枚举的Description
        /// </summary>
        /// <param name="value">枚举值</param>
        /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
        /// <returns>枚举的Description</returns>
        public static string GetDescription(this Enum value, Boolean nameInstead = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name == null)
            {
                return null;
            }

            FieldInfo field = type.GetField(name);
            DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;

            if (attribute == null && nameInstead == true)
            {
                return name;
            }
            return attribute?.Description;
        }

    }




}