package com.smppw.modaq.domain.dto.report;

import com.smppw.modaq.domain.entity.report.ReportFundTransactionDO;
import com.smppw.modaq.infrastructure.util.ConvertUtil;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;

@Setter
@Getter
public class ReportFundTransactionDTO extends BaseReportDTO<ReportFundTransactionDO> {
    /**
     * 基金账户编号
     */
    private String fundAccount;

    /**
     * 基金名称
     */
    private String fundName;

    /**
     * 销售此基金产品的经销商或银行
     */
    private String distributor;

    /**
     * 业务类型（例如：申购、赎回）
     */
    private String transactionType;

    /**
     * 业务操作的原因或类型说明
     */
    private String businessReason;

    /**
     * 交易确认的状态（例如：已确认、待处理等）
     */
    private String status;

    /**
     * 交易确认的日期
     */
    private String holdingDate;

    /**
     * 申请的日期
     */
    private String applyDate;

    /**
     * 申请的金额
     */
    private String applyAmount;

    /**
     * 申请的基金份额数量
     */
    private String applyShare;

    /**
     * 确认的金额
     */
    private String amount;

    /**
     * 确认的基金份额数量
     */
    private String share;

    /**
     * 净认购/申购的金额，确认净额
     */
    private String netAmount;

    /**
     * 单位净值
     */
    private String nav;

    /**
     * 确认比例
     */
    private String confirmationRatio;

    /**
     * 交易授权确认编号
     */
    private String taConfirmationNumber;

    /**
     * TA代码
     */
    private String taNumber;

    /**
     * 申请单号
     */
    private String applyNo;

    /**
     * 份额余额
     */
    private String shareBalance;

    /**
     * 份额类别
     */
    private String shareCategory;

    /**
     * 巨额赎回方式
     */
    private String largeRedemptionType;

    /**
     * 提成或保底标志
     */
    private String rewardMark;

    /**
     * 持有天数
     */
    private String holdingDays;

    /**
     * 份额明细注册日期
     */
    private String shareRegistryDate;

    // -- 费用 ----------------------------------------

    /**
     * 总费用
     */
    private String fee;

    /**
     * 利息
     */
    private String interest;

    /**
     * 利息转份额/利息归基金资产
     */
    private String interestToFundAssets;

    /**
     * 交易费
     */
    private String tradeFee;

    /**
     * 违约金
     */
    private String defaultFee;

    /**
     * 业绩报酬
     */
    private String performanceFee;

    /**
     * 费用折扣
     */
    private String feeDiscounts;

    /**
     * 业绩报酬折扣
     */
    private String performanceFeeDiscounts;

    // ---- 分红 -----------------------------------------------

    /**
     * 分红方式
     */
    private String dividendType;

    /**
     * 分红登记日
     */
    private String dividendRegistryDate;

    /**
     * 红利发放日
     */
    private String dividendPaymentDate;

    /**
     * 分红基数份额
     */
    private String baseShareDividend;

    /**
     * 分红模式
     */
    private String dividendMode;

    /**
     * 单位分红
     */
    private String unitDividend;

    /**
     * 每单位分红
     */
    private String dividendPerUnit;

    /**
     * 红利总额
     */
    private String totalDividendAmount;

    /**
     * 实发现金红利
     */
    private String actualCashDividend;

    /**
     * 冻结份额
     */
    private String frozenShares;

    /**
     * 冻结金额
     */
    private String frozenAmount;

    /**
     * 实际业绩提成金额
     */
    private String actualPerformanceAmount;

    /**
     * 实际提成份额
     */
    private String actualPerformanceShare;

    @Override
    public ReportFundTransactionDO toEntity() {
        ReportFundTransactionDO entity = new ReportFundTransactionDO();
        entity.setFileId(this.getFileId());
        entity.setFundAccount(fundAccount);
        entity.setFundName(fundName);
        entity.setDistributor(distributor);
        entity.setTransactionType(transactionType);
        entity.setBusinessReason(businessReason);
        entity.setStatus(status);
        entity.setHoldingDate(ConvertUtil.toDate(holdingDate));
        entity.setApplyDate(ConvertUtil.toDate(applyDate));
        entity.setApplyAmount(ConvertUtil.toBigDecimal(applyAmount));
        entity.setApplyShare(ConvertUtil.toBigDecimal(applyShare));
        entity.setAmount(ConvertUtil.toBigDecimal(amount, BigDecimal.ZERO));
        entity.setShare(ConvertUtil.toBigDecimal(share, BigDecimal.ZERO));
        entity.setNetAmount(ConvertUtil.toBigDecimal(netAmount, BigDecimal.ZERO));
        entity.setNav(ConvertUtil.toBigDecimal(nav));
        entity.setConfirmationRatio(ConvertUtil.toBigDecimal(confirmationRatio));
        entity.setTaConfirmationNumber(taConfirmationNumber);
        entity.setTaNumber(taNumber);
        entity.setApplyNo(applyNo);
        entity.setShareBalance(ConvertUtil.toBigDecimal(shareBalance));
        entity.setShareCategory(shareCategory);
        entity.setLargeRedemptionType(largeRedemptionType);
        entity.setRewardMark(rewardMark);
        entity.setHoldingDays(holdingDays);
        entity.setShareRegistryDate(ConvertUtil.toDate(shareRegistryDate));
        // --- 以下是费用
        entity.setFee(ConvertUtil.toBigDecimal(fee));
        entity.setInterest(ConvertUtil.toBigDecimal(interest));
        entity.setInterestToFundAssets(ConvertUtil.toBigDecimal(interestToFundAssets));
        entity.setTradeFee(ConvertUtil.toBigDecimal(tradeFee));
        entity.setDefaultFee(ConvertUtil.toBigDecimal(defaultFee));
        entity.setPerformanceFee(ConvertUtil.toBigDecimal(performanceFee));
        entity.setFeeDiscounts(ConvertUtil.toBigDecimal(feeDiscounts));
        entity.setPerformanceFeeDiscounts(ConvertUtil.toBigDecimal(performanceFeeDiscounts));
        // --- 以下是分红
        entity.setDividendType(dividendType);
        entity.setDividendRegistryDate(ConvertUtil.toDate(dividendRegistryDate));
        entity.setDividendPaymentDate(ConvertUtil.toDate(dividendPaymentDate));
        entity.setBaseShareDividend(ConvertUtil.toBigDecimal(baseShareDividend));
        entity.setDividendMode(dividendMode);
        entity.setUnitDividend(ConvertUtil.toBigDecimal(unitDividend));
        entity.setDividendPerUnit(ConvertUtil.toBigDecimal(dividendPerUnit));
        entity.setTotalDividendAmount(ConvertUtil.toBigDecimal(totalDividendAmount));
        entity.setActualCashDividend(ConvertUtil.toBigDecimal(actualCashDividend));
        entity.setFrozenShares(ConvertUtil.toBigDecimal(frozenShares));
        entity.setFrozenAmount(ConvertUtil.toBigDecimal(frozenAmount));
        entity.setActualPerformanceAmount(ConvertUtil.toBigDecimal(actualPerformanceAmount));
        entity.setActualPerformanceShare(ConvertUtil.toBigDecimal(actualPerformanceShare));
        this.initEntity(entity);
        return entity;
    }

    @Override
    public String toString() {
        return "{" +
                super.toString() +
                ", transactionType='" + transactionType + '\'' +
                ", holdingDate='" + holdingDate + '\'' +
                ", amount='" + amount + '\'' +
                ", share='" + share + '\'' +
                '}';
    }
}
