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

namespace ZR.Common
{
    public class ExcelHelper<T> where T : new()
    {
        /// <summary>
        /// 导入数据
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        //public static IEnumerable<T> ImportData(Stream stream)
        //{
        //    using ExcelPackage package = new(stream);
        //    //ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        //    ExcelWorksheet worksheet = package.Workbook.Worksheets[0];//读取第1个sheet
        //    //获取表格的列数和行数

        //    int colStart = worksheet.Dimension.Start.Column;
        //    int colEnd = worksheet.Dimension.End.Column;
        //    int rowStart = worksheet.Dimension.Start.Row;
        //    int rowEnd = worksheet.Dimension.End.Row;
        //    //int rowCount = worksheet.Dimension.Rows;
        //    //int ColCount = worksheet.Dimension.Columns;

        //    List<T> resultList = new();
        //    List<PropertyInfo> propertyInfos = new();// new(typeof(T).GetProperties());
        //    Dictionary<string, int> dictHeader = new();
        //    for (int i = colStart; i < colEnd; i++)
        //    {
        //        var name = worksheet.Cells[rowStart, i].Value?.ToString();
        //        dictHeader[name] = i;

        //        PropertyInfo propertyInfo = MapPropertyInfo(name);
        //        if (propertyInfo != null)
        //        {
        //            propertyInfos.Add(propertyInfo);
        //        }
        //    }
        //    for (int row = rowStart + 1; row <= rowEnd; row++)
        //    {
        //        T result = new();

        //        foreach (PropertyInfo p in propertyInfos)
        //        {
        //            try
        //            {
        //                ExcelRange cell = worksheet.Cells[row, dictHeader[p.Name]];
        //                if (cell.Value == null)
        //                {
        //                    continue;
        //                }
        //                switch (p.PropertyType.Name.ToLower())
        //                {
        //                    case "string":
        //                        p.SetValue(result, cell.GetValue<string>());
        //                        break;
        //                    case "int16":
        //                        p.SetValue(result, cell.GetValue<short>()); break;
        //                    case "int32":
        //                        p.SetValue(result, cell.GetValue<int>()); break;
        //                    case "int64":
        //                        p.SetValue(result, cell.GetValue<long>()); break;
        //                    case "decimal":
        //                        p.SetValue(result, cell.GetValue<decimal>());
        //                        break;
        //                    case "double":
        //                        p.SetValue(result, cell.GetValue<double>()); break;
        //                    case "datetime":
        //                        p.SetValue(result, cell.GetValue<DateTime>()); break;
        //                    case "boolean":
        //                        p.SetValue(result, cell.GetValue<bool>()); break;
        //                    case "char":
        //                        p.SetValue(result, cell.GetValue<string>()); break;
        //                    default:
        //                        break;
        //                }
        //            }
        //            catch (KeyNotFoundException ex)
        //            {
        //                Console.WriteLine("未找到该列将继续循环，" + ex.Message);
        //                continue;
        //            }
        //        }
        //        resultList.Add(result);
        //    }

        //    return resultList;
        //}

        /// <summary>
        /// 查找Excel列名对应的实体属性
        /// </summary>
        /// <param name="columnName"></param>
        /// <returns></returns>
        public static PropertyInfo MapPropertyInfo(string columnName)
        {
            PropertyInfo[] propertyList = GetProperties(typeof(T));
            PropertyInfo propertyInfo = propertyList.Where(p => p.Name == columnName).FirstOrDefault();
            if (propertyInfo != null)
            {
                return propertyInfo;
            }
            else
            {
                foreach (PropertyInfo tempPropertyInfo in propertyList)
                {
                    System.ComponentModel.DescriptionAttribute[] attributes = (System.ComponentModel.DescriptionAttribute[])tempPropertyInfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
                    if (attributes.Length > 0)
                    {
                        if (attributes[0].Description == columnName)
                        {
                            return tempPropertyInfo;
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// 得到类里面的属性集合
        /// </summary>
        /// <param name="type"></param>
        /// <param name="columns"></param>
        /// <returns></returns>
        public static PropertyInfo[] GetProperties(Type type, string[] columns = null)
        {
            PropertyInfo[] properties = null;
            properties = type.GetProperties();

            if (columns != null && columns.Length > 0)
            {
                //  按columns顺序返回属性
                var columnPropertyList = new List<PropertyInfo>();
                foreach (var column in columns)
                {
                    var columnProperty = properties.Where(p => p.Name == column).FirstOrDefault();
                    if (columnProperty != null)
                    {
                        columnPropertyList.Add(columnProperty);
                    }
                }
                return columnPropertyList.ToArray();
            }
            else
            {
                return properties;
            }
        }
    }
}
