package com.bonus.material.devchange.domain;

import com.bonus.common.core.annotation.Excel;
import com.bonus.material.device.domain.vo.DevInfoPropertyVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 装备Excel导出实体类
 * 存储装备导出所需的详细信息，含固定9组特征项
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MaDevInfoXlsx {
    /**
     * 设备id（不导出）
     */
    @ApiModelProperty(value = "设备ID")
    private Integer maId;

    /**
     * 所属省份
     */
    @Excel(name = "所属省份")
    @ApiModelProperty(value = "所属省份")
    private String province;


    /**
     * 产权单位
     */
    @Excel(name = "产权单位")
    @ApiModelProperty(value = "产权单位")
    private String propertyUnit;

    /**
     * 专业
     */
    @Excel(name = "专业")
    @ApiModelProperty(value = "专业")
    private String major;

    /**
     * 工序（子工序）
     */
    @Excel(name = "工序")
    @ApiModelProperty(value = "工序")
    private String subProcess;

    /**
     * 装备类目（小类目）
     */
    @Excel(name = "装备类目")
    @ApiModelProperty(value = "装备类目")
    private String subCategory;

    /**
     * 类型分支（装备分支）
     */
    @Excel(name = "装备名称")
    @ApiModelProperty(value = "类型分支")
    private String name;

    /**
     * 规格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;

    /**
     * 装备编码
     */
    @Excel(name = "装备编码")
    @ApiModelProperty(value = "装备编码")
    private String code;

    /**
     * 装备状态
     */
    @Excel(name = "装备状态", readConverterExp = "1=在库,2=自用,3=共享,4=退役,5=维修", // 核心：配置转换规则
            defaultValue = "在库") // 空值默认显示「下架」)
    @ApiModelProperty(value = "装备状态")
    private String status;
    /**
     * 上下架状态：通过 readConverterExp 配置映射规则（1=上架，0=下架）
     */
    @Excel(
            name = "上下架状态",
            readConverterExp = "1=上架,0=下架", // 核心：配置转换规则
            defaultValue = "下架" // 空值默认显示「下架」
    )
    @ApiModelProperty(value = "上下架状态")
    private String upDownStatus; // 字段类型：String/Integer均可

    /**
     * 使用年限
     */
    @Excel(name = "使用年限")
    @ApiModelProperty(value = "使用年限")
    private String serviceLife;

    /**
     * 使用项目ID（不导出）
     */
    @ApiModelProperty(value = "使用项目ID")
    private String usingProjectId;

    /**
     * 使用项目
     */
    @Excel(name = "使用项目")
    @ApiModelProperty(value = "使用项目")
    private String usingProject;

    /**
     * 使用到期时间
     */
    @Excel(name = "使用到期时间", dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "使用到期时间（yyyy-MM-dd）")
    private Date expirationTime;

    /**
     * 使用次数
     */
    @Excel(name = "使用次数")
    @ApiModelProperty(value = "使用次数")
    private Integer usageCount;

    /**
     * 维修次数
     */
    @Excel(name = "维修次数")
    @ApiModelProperty(value = "维修次数")
    private Integer repairCount;

    /**
     * 装备原始编码
     */
    @Excel(name = "装备原始编码")
    @ApiModelProperty(value = "装备原始编码")
    private String originalCode;

    /**
     * 计量单位
     */
    @Excel(name = "计量单位")
    @ApiModelProperty(value = "计量单位")
    private String unit;

    /**
     * 生产厂家ID（不导出）
     */
    @ApiModelProperty(value = "生产厂家ID")
    private Integer manufacturerId;

    /**
     * 生产厂家
     */
    @Excel(name = "生产厂家")
    @ApiModelProperty(value = "生产厂家")
    private String manufacturer;

    /**
     * 出厂日期
     */
    @Excel(name = "出厂日期", dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "出厂日期（yyyy-MM-dd）")
    private Date productionDate;

    /**
     * 采购日期
     */
    @Excel(name = "采购日期", dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "采购日期（yyyy-MM-dd）")
    private Date purchaseDate;

    /**
     * 资产原值（元）
     */
    @Excel(name = "资产原值（元）")
    @ApiModelProperty(value = "资产原值（元）")
    private BigDecimal originalValue;

    /**
     * 最大使用年限（年）
     */
    @Excel(name = "最大使用年限（年）")
    @ApiModelProperty(value = "最大使用年限（年）")
    private Integer maxServiceLifeYears;

    /**
     * 下次维保日期
     */
    @Excel(name = "下次维保日期", dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @ApiModelProperty(value = "下次维保日期（yyyy-MM-dd）")
    private Date nextMaintenanceDate;



    // 固定9组特征项+特征值
    @Excel(name = "特征项1")
    @ApiModelProperty(value = "特征项1")
    private String propertyName1;

    @Excel(name = "特征值1")
    @ApiModelProperty(value = "特征值1")
    private String propertyValue1;

    @Excel(name = "特征项2")
    @ApiModelProperty(value = "特征项2")
    private String propertyName2;

    @Excel(name = "特征值2")
    @ApiModelProperty(value = "特征值2")
    private String propertyValue2;

    @Excel(name = "特征项3")
    @ApiModelProperty(value = "特征项3")
    private String propertyName3;

    @Excel(name = "特征值3")
    @ApiModelProperty(value = "特征值3")
    private String propertyValue3;

    @Excel(name = "特征项4")
    @ApiModelProperty(value = "特征项4")
    private String propertyName4;

    @Excel(name = "特征值4")
    @ApiModelProperty(value = "特征值4")
    private String propertyValue4;

    @Excel(name = "特征项5")
    @ApiModelProperty(value = "特征项5")
    private String propertyName5;

    @Excel(name = "特征值5")
    @ApiModelProperty(value = "特征值5")
    private String propertyValue5;

    @Excel(name = "特征项6")
    @ApiModelProperty(value = "特征项6")
    private String propertyName6;

    @Excel(name = "特征值6")
    @ApiModelProperty(value = "特征值6")
    private String propertyValue6;

    @Excel(name = "特征项7")
    @ApiModelProperty(value = "特征项7")
    private String propertyName7;

    @Excel(name = "特征值7")
    @ApiModelProperty(value = "特征值7")
    private String propertyValue7;

    @Excel(name = "特征项8")
    @ApiModelProperty(value = "特征项8")
    private String propertyName8;

    @Excel(name = "特征值8")
    @ApiModelProperty(value = "特征值8")
    private String propertyValue8;

    @Excel(name = "特征项9")
    @ApiModelProperty(value = "特征项9")
    private String propertyName9;

    @Excel(name = "特征值9")
    @ApiModelProperty(value = "特征值9")
    private String propertyValue9;


    private Integer devId;
    /**
     * 类型id
     */
    private Integer typeId;
    /**
     * 订单id
     */
    private Integer orderId;

    /**
     * 专业Id
     * 说明：装备所属的专业领域（如机械、电子、建筑等）
     */
    private Integer majorId;

    /**
     * 管理模式
     */
    private String manageType;
    /**
     * 数量
     */
    private Integer count;
    /**
     * 主工序id
     */
    private Integer mainProcessId;
    /**
     * 主工序
     * 说明：装备主要参与的工序环节
     */
    private String mainProcess;
    /**
     * 子工序id
     * 说明：装备参与的具体子工序
     */
    private Integer subProcessId;


    /**
     * 装备大类目id
     * 说明：装备所属的一级分类（如工程机械、仪器仪表等）
     */
    private Integer mainCategoryId;
    /**
     * 装备大类目
     * 说明：装备所属的一级分类（如工程机械、仪器仪表等）
     */
    private String mainCategory;
    /**
     * 装备小类目id
     * 说明：装备所属的二级分类，主类目下的细分分类
     */
    private Integer subCategoryId;

    /**
     * 装备分支id
     * 说明：小类目下的更细分类，代表具体的装备类型分支
     */
    private Integer branchId;


    // 新增：开始出厂时间（查询条件，用于筛选 >= 该日期的记录）
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startProductionDate;

    // 新增：结束出厂时间（查询条件，用于筛选 <= 该日期的记录）
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endProductionDate;


    /**
     * 开始采购日期
     * 说明：装备被采购入库的日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startPurchaseDate;
    /**
     * 结束采购日期
     * 说明：装备被采购入库的日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endPurchaseDate;


    /**
     * 最小资产原值（元）
     * 说明：装备的原始采购价值，以元为单位
     */
    private BigDecimal minOriginalValue;


    /**
     * 最大资产原值（元）
     * 说明：装备的原始采购价值，以元为单位
     */
    private BigDecimal maxOriginalValue;


    /**
     * 产权单位id
     * 说明：装备的所有权所属单位
     */
    private Integer propertyUnitId;


    /**
     * 装备外观
     * 说明：装备外观图片的URL列表，存储装备的外观照片
     */
    private List<MaDevFile> appearanceImages;

    /**
     * 合格证
     * 说明：装备合格证的URL列表，存储合格证扫描件或照片
     */
    private List<MaDevFile> certificates;

    /**
     * 定期检验报告
     * 说明：装备定期检验报告的URL列表
     */
    private List<MaDevFile> inspectionReports;

    /**
     * 采购发票
     * 说明：装备采购发票的URL列表，存储发票扫描件或照片
     */
    private List<MaDevFile> purchaseInvoices;

    /**
     * 订单编号
     */
    private String orderNumber;
    /**
     * 订单创建人
     */
    private String orderCreateUser;
    /**
     * 订单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date orderCreateTime;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startOrderCreateTime;

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endOrderCreateTime;
    /**
     * 订单时间
     */

    private String orderStatus;

    private String daysDiff;

    private String remainingDays;

    private String remainingYears;

    private String yearsDiff;

    private String expirationYears;

    private String actualStartYear;

    private String remainingStartYear;

    private String isWarn;
    private String entryStatus;

    private String remainingStopYear;

    private String actualStopYear;

    /**
     * 特征项列表（不导出，用于映射到上述9组字段）
     */
    @ApiModelProperty(value = "特征项列表")
    private List<DevInfoPropertyVo> propertyVoList;

    /**
     * 自动填充特征项到9组固定字段（核心优化：避免手动赋值）
     * 调用时机：propertyVoList设置后执行
     */
    public void fillPropertyFields() {
        if (CollectionUtils.isEmpty(propertyVoList)) {
            return; // 无特征项，直接返回
        }

        // 循环处理前9个特征项（超过9个则忽略，符合Excel固定列设计）
        for (int i = 0; i < Math.min(propertyVoList.size(), 9); i++) {
            DevInfoPropertyVo property = propertyVoList.get(i);
            int index = i + 1; // 特征项序号（1~9）

            // 根据序号设置对应的特征项名称和值（通过反射简化重复代码）
            try {
                // 设置特征项名称（propertyName1~9）
                this.getClass().getDeclaredField("propertyName" + index)
                        .set(this, property.getPropertyName()); // 假设DevInfoPropertyVo的特征项名称字段是propertyKey
                // 设置特征值（propertyValue1~9）
                this.getClass().getDeclaredField("propertyValue" + index)
                        .set(this, property.getPropertyValue()); // 假设特征值字段是propertyValue
            } catch (Exception e) {
                // 反射异常时跳过该特征项，不影响整体导出
                e.printStackTrace();
            }
        }
    }
}