package com.yd.csf.service.vo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.CommissionExpected;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;

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

@Data
@ContentRowHeight(15)
@HeadRowHeight(20)
@ColumnWidth(20)
public class CommissionExpectedExportNewDTO {

    /**
     * 是否实收：1-预计（预计来佣记录） 2-实收（保单来佣表记录）*
     */
    @ExcelProperty("是否实收")
    private String typeName;

    /**
     * 应收款类型 R=关联保单应收单 U=非关联保单应收单
     */
    @ExcelProperty("应收单类型")
    private String commissionBizType;

    /**
     * 组编号（应收单编号）*
     */
    @ExcelProperty("应收单编号")
    private String no;

    /**
     * 预计来佣-保单号
     */
    @ExcelProperty("保单号")
    private String policyNo;

    /**
     * 预计来佣-对账公司
     */
    @ExcelProperty("对账公司")
    private String reconciliationCompany;

    /**
     * 预计来佣-入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
     */
    @ExcelProperty("入账状态")
    private String status;

    /**
     * 预计来佣-佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
     */
    @ExcelProperty("入账期数")
    private Integer commissionPeriod;

    /**
     * 预计来佣-总来佣期数
     */
    @ExcelProperty("入账总期数")
    private Integer totalPeriod;

    /**
     * 预计来佣-来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
     */
    @ExcelProperty("入账项目")
    private String commissionName;

    /**
     * 预计来佣-入账年月（估） * （预计来佣日期）
     */
    @ExcelProperty("入账年月（估）")
    @DateTimeFormat("yyyyMM")
    private Date commissionDateMonth;

    /**
     * 入账检核记录-入账年月实（来佣日期 yyyyMM）
     */
    @ExcelProperty("入账年月（实）")
    @DateTimeFormat("yyyyMM")
    private Date commissionDate;

    /**
     * 预计来佣-已入账来佣比例 (%) （ 累积已入账比例 = 预计来佣实佣率realRate/产品对应来佣率）
     */
    @ExcelProperty("累积已入账比例")
    private BigDecimal totalRevenueRatio;

    /**
     * 预计来佣-预计入账比例 (%)（产品对应来佣率）
     */
    @ExcelProperty("产品对应来佣率")
    private BigDecimal commissionRatio;

    /**
     * 入账检核记录-实佣率（入账金额/结算汇率/期交保费） *
     * 如果这里是否实收是预计：realRate统计当前预计下面的实际来拥记录的实佣率累加和
     * 如果这里是否实收是实收：realRate取realCurrentCommissionRatio赋值
     */
    @ExcelProperty("实佣率")
    private BigDecimal realRate;

    /**
     * 达成率缺口（1-实佣率/产品对应来佣率）*
     */
    @ExcelProperty("达成率缺口")
    private BigDecimal gapRate;

    /**
     * 入账检核记录-当前结算汇率（结算汇率（实））
     */
    @ExcelProperty("结算汇率实")
    private BigDecimal realExchangeRate;

    /**
     * 入账检核记录-来佣金额（已入账金额）（预计类型需要统计累计和值）
     */
    @ExcelProperty("已入账金额")
    private BigDecimal realAmount;

    /**
     * 入账检核记录-入账检核年月 yyyyMM（检核年月）
     */
    @ExcelProperty("检核年月")
    private String realReconciliationYearMonth;

    /**
     * 入账检核记录-本次入账比例（实佣率/产品对应来佣率）
     */
    @ExcelProperty("本次入账比例")
    private BigDecimal revenueRatio;

    /**
     * 预计来佣-待入账金额
     */
    @ExcelProperty("待入账金额")
    private BigDecimal pendingAmount;

    /**
     * 预计来佣-预计入账金额（HKD）
     */
    @ExcelProperty("预计入账金额")
    private BigDecimal expectedAmount;

    /**
     * 预计来佣-结算汇率（估）
     */
    @ExcelProperty("结算汇率估")
    private BigDecimal defaultExchangeRate;

    /**
     * 预计来佣-保险公司
     */
    @ExcelProperty("保险公司")
    private String insuranceCompany;

    /**
     * 预计来佣-产品计划名称
     */
    @ExcelProperty("产品计划")
    private String productName;

    /**
     * 年期（供款年期）
     */
    @ExcelProperty("年期")
    private Integer issueNumber;

    /**
     * 预计来佣-保单币种
     */
    @ExcelProperty("保单币种")
    private String policyCurrency;

    /**
     * 预计来佣-期交保费
     */
    @ExcelProperty("期交保费")
    private String premium;

    /**
     * 入账检核记录-通用备注
     */
    @ExcelProperty("备注")
    private String realRemark;

    /**
     * 入账检核记录-更新人名称
     */
    @ExcelProperty("操作人")
    private String realUpdaterName;

    /**
     * 入账检核记录-更新时间
     */
    @ExcelProperty("操作时间")
    @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
    @ColumnWidth(20)
    private Date realUpdateTime;

    /**
     * 将对象转换为导出DTO
     */
    public static CommissionExpectedExportNewDTO convertToExportDTO(CommissionExpectedNewVO vo) {
        CommissionExpectedExportNewDTO dto = new CommissionExpectedExportNewDTO();
        BeanUtils.copyProperties(vo,dto);
        dto.setTypeName(vo.getType() == 1 ? "预计" : "实收");
        dto.setCommissionBizType("R".equals(vo.getCommissionBizType()) ? "关联保单应收单" : "非关联保单应收单");
        dto.setStatus(getStatusText(vo.getStatus()));
        dto.setPremium(vo.getPremium() != null ? vo.getPremium().toString() : "");
        return dto;
    }

    /**
     * 获取状态文本
     */
    public static String getStatusText(String status) {
        if (status == null) return "未知";
        switch (status) {
            case "0":
                return "待入账";
            case "1":
                return "完成入账";
            case "2":
                return "部分入账";
            case "3":
                return "已失效";
            default:
                return "未知";
        }
    }
}
