package com.yd.csf.service.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;

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

@Data
@Schema(description = "预计来佣响应")
public class CommissionExpectedNewVO implements Serializable {
    //===========公共字段=============
    /**
     * 是否实收：1-预计（预计来佣记录） 2-实收（保单来佣表记录）*
     */
    private Integer type;

    /**
     * 组编号（应收单编号）*
     */
    private String no;

    //===========以下是预计来佣记录=============

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

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

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

    /**
     * 预计来佣-对账公司业务ID
     */
//    @Schema(description = "对账公司业务ID")
    private String reconciliationCompanyBizId;

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

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

    /**
     * 预计来佣-总来佣期数
     */
//    @Schema(description = "总来佣期数")
    private Integer totalPeriod;

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

    /**
     * 预计来佣-入账年月（估） * （预计来佣日期）
     */
//    @Schema(description = "入账年月（估）")
    @JsonFormat(pattern = "yyyyMM", timezone = "GMT+8")
    private Date commissionDateMonth;

    /**
     * 入账检核记录-入账年月实（来佣日期 yyyyMM）
     */
    @JsonFormat(pattern = "yyyyMM", timezone = "GMT+8")
    private Date commissionDate;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * 年期（供款年期）
     */
    private Integer issueNumber;

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

    /**
     * 预计来佣-期交保费
     */
//    @Schema(description = "期交保费")
    private Object premium;

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

    /**
     * 入账检核记录-更新人名称
     */
    private String realUpdaterName;

    /**
     * 入账检核记录-更新时间
     */
//    @Schema(description = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date realUpdateTime;









//    /**
//     * 预计来佣id
//     */
//    @Schema(description = "预计来佣id")
//    private Long id;
//
//    /**
//     * 预计来佣业务id
//     */
//    @Schema(description = "预计来佣业务id")
//    private String commissionExpectedBizId;
//
//    /**
//     * 应收账款编号
//     */
//    @Schema(description = "应收账款编号")
//    private String receivableNo;
//
//    /**
//     * 应收款类型 R=关联保单应收单 U=非关联保单应收单
//     */
//    @Schema(description = "应收款类型 R=关联保单应收单 U=非关联保单应收单")
//    private String commissionBizType;
//
//    /**
//     * 保险公司业务ID
//     */
//    @Schema(description = "保险公司业务ID")
//    private String insuranceCompanyBizId;
//
//    /**
//     * 产品上架信息表唯一业务ID
//     */
//    @Schema(description = "产品计划: 产品上架信息表唯一业务ID")
//    private String productLaunchBizId;
//
//    /**
//     * 来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
//     */
//    @Schema(description = "来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
//    private String commissionType;
//
//    /**
//     * 预计入账金额
//     */
//    @Schema(description = "预计入账金额 HKD（如果不关联保单，就没有预计入账比例，此时记录预计入账金额）")
//    private BigDecimal amount;
//
//    /**
//     * 来佣币种
//     */
//    @Schema(description = "来佣币种")
//    private String currency;
//
//    /**
//     * 预计来佣日期
//     */
//    @Schema(description = "预计来佣日期")
//    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
//    private Date commissionDate;
//
//    /**
//     * 设置入账状态-修改理由
//     */
//    @Schema(description = "设置入账状态-修改理由")
//    private String statusDesc;
//
//    /**
//     * 已入账来佣金额（HKD）
//     */
//    @Schema(description = "已入账来佣金额（HKD）")
//    private BigDecimal paidAmount;
//
//    /**
//     * 待入账比例
//     */
//    @Schema(description = "待入账比例")
//    private BigDecimal pendingRatio;
//
//    /**
//     * 已入账来佣列表
//     */
//    @Schema(description = "已入账来佣列表")
//    private List<Commission> commissionList;
//
//    /**
//     * 通用备注
//     */
//    @Schema(description = "备注")
//    private String remark;
//
//    /**
//     * 创建人ID
//     */
//    @Schema(description = "创建人ID")
//    private String creatorId;
//
//    /**
//     * 更新人ID
//     */
//    @Schema(description = "更新人ID")
//    private String updaterId;
//
//    /**
//     * 创建时间
//     */
//    @Schema(description = "创建时间")
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
//    private Date createTime;
//
//    /**
//     * 更新时间
//     */
//    @Schema(description = "更新时间")
//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
//    private Date updateTime;
//
//
//    //===========以下是入账检核（保单来佣）记录=============
//
//    /**
//     * 入账检核记录-来佣日期（入账日实）
//     */
//    @Schema(description = "来佣日期（入账日实）")
//    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
//    private Date realCommissionDate;
//
    /**
     * 当前来佣比例 （实佣率=实际入账金额/结算汇率/每期保费）（入账比例）
     */
    @Schema(description = "当前来佣比例 （实佣率=实际入账金额/结算汇率/每期保费）")
    private BigDecimal realCurrentCommissionRatio;


    private static final long serialVersionUID = 1L;

//    /**
//     * 对象转封装类
//     *
//     * @param commissionExpected
//     * @return
//     */
//    public static CommissionExpectedNewVO objToVo(CommissionExpected commissionExpected) {
//        if (commissionExpected == null) {
//            return null;
//        }
//        CommissionExpectedNewVO commissionVO = new CommissionExpectedNewVO();
//        BeanUtils.copyProperties(commissionExpected, commissionVO);
//
//        BigDecimal paidAmount1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidAmount(), BigDecimal.ZERO);
//        BigDecimal paidRatio1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidRatio(), BigDecimal.ZERO);
//
//        // 待入账比例、待入账金额
//        if (commissionExpected.getCommissionRatio() != null) {
//            commissionVO.setPaidRatio(paidRatio1);
//            commissionVO.setPendingRatio(commissionExpected.getCommissionRatio().subtract(paidRatio1));
//            if (commissionExpected.getExpectedAmount() != null) {
//                commissionVO.setPaidAmount(paidAmount1);
//                commissionVO.setPendingAmount(commissionExpected.getExpectedAmount().subtract(paidAmount1));
//            }
//            return commissionVO;
//        } else {
//            commissionVO.setPaidAmount(paidAmount1);
//            commissionVO.setPendingAmount(commissionExpected.getAmount().subtract(paidAmount1));
//
//            return commissionVO;
//        }
//    }
}
