using NPOI.SS.UserModel;
using System;
using System.ComponentModel;
using DeviceRepairAndOptimization.Common.NpoiExtend;
using System.Reflection;

namespace DeviceRepairAndOptimization.Biz.AM.Templates
{
    public class FM_P0075_15
    {
        /// <summary>
        /// 序号
        /// </summary>
        [Description("序号")]
        public string OrderNumber = "[A,3]";

        /// <summary>
        /// 设备型号
        /// </summary>
        [Description("设备型号")]
        public string EquipmentTs = "[A,1]";

        /// <summary>
        /// 设备编号
        /// </summary>
        [Description("设备编号")]
        public string EquipmentID = "[I,1]";

        /// <summary>
        /// 班次
        /// </summary>
        [Description("班次")]
        public string Banci = "[H,3]";

        /// <summary>
        /// 其他异常处理
        /// </summary>
        [Description("其它异常\n及处理")]
        public string ExceptionContent = "[A,15]";

        /// <summary>
        /// 点检者\n签名
        /// </summary>
        [Description("点检者\n签名")]
        public string Signature = "[G,15]";

        public ArgumentException CheckCurrentSheet(ISheet sheet)
        {
            try
            {
                var type = this.GetType();
                FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);
                foreach (var item in fields)
                {
                    string Description = string.Empty;
                    object[] attrs = item.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    if (null != attrs && attrs.Length > 0)
                    {
                        DescriptionAttribute description = (DescriptionAttribute)attrs[0];
                        Description = description.Description;
                    }

                    string field = item.GetValue(this)?.ToString();
                    if (item.Name == "ExceptionContent" || item.Name == "Signature" || item.Name == "MaintenanceDate")
                    {
                        ICell cell = sheet.LocateCellByAddress(field);
                        if (cell.CellType != CellType.String)
                        {
                            int RowIndex = cell.RowIndex;
                            bool HasError = true;
                            while (RowIndex < sheet.LastRowNum)
                            {
                                RowIndex++;
                                if (sheet.GetRow(RowIndex).Cells[cell.ColumnIndex].CellType == CellType.String
                                    && Description.Equals(sheet.GetRow(RowIndex).Cells[cell.ColumnIndex].StringCellValue, StringComparison.CurrentCultureIgnoreCase)
                                    )
                                {
                                    HasError = false;
                                    break;
                                }
                            }

                            if (HasError)
                            {
                                return new ArgumentException($"当前点检表格式不正确，操作失败！");
                            }
                        }
                    }
                    else
                    {
                        string CellValue = sheet.LocateCellByAddress(field).StringCellValue;
                        if (!Description.Equals(CellValue, StringComparison.CurrentCultureIgnoreCase))
                            return new ArgumentException($"当前点检表格式不正确，操作失败！");
                    }
                }
            }
            catch (Exception ex)
            {
                return new ArgumentException(ex.Message);
            }

            return null;
        }
    }
}
