package com.jeequan.jeepay.core.model.applyment;

import com.alibaba.fastjson.JSON;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/***
* 渠道手续费计算方式
*
* @author terrfly
*
* @date 2023/6/7 14:48
*/
@Data
public class ChannelFeeCalModel {

    /** 手续费计算方式：
     * 1.基于最新收单金额计算：       BASE_FINAL_ORDER_AMOUNT ：  手续费退还金额 =  收单手续费 - （订单金额 - 退款金额） X 费率    （  得到最新的实际支付金额，再计算手续费， 最后减去差值 ）
     * 2. 收单金额和退款金额分开计算： SPLIT_PAY_REFUND_AMOUNT：   手续费退还金额 = 收单手续费 - 退款金额 X 费率     （  依据退款订单金额计算手续费， 目前支付宝采用这种方式。  ）
     *
     * 对比：
     * 1. 基于最新收单金额计算（BASE_FINAL_ORDER_AMOUNT）：  优点为比较精准： 每次都已最新的实际收单金额计算。 缺点： 逻辑比较复杂。
     * 2. 收单金额和退款金额分开计算（SPLIT_PAY_REFUND_AMOUNT）： 优点为计算简单， 且目前支付宝采用该方式，  缺点： 可能出现 包含实收金额但不收取商家手续费的情况，例如：
     * 商家费率0.6%， 订单金额6元， 第一次退款2.5元，第二次退款2.5元，  客户实付 1元
     * 按照 SPLIT_PAY_REFUND_AMOUNT 模式计算 商家实际手续费： 6X0.6% - 2.5X0.6% - 2.5X0.6% = 0.03 - 0.02 - 0.02 = -0.01 = 0 元。
     * 按照 BASE_FINAL_ORDER_AMOUNT 模式计算 商家实际手续费： 1 X 0.6% = 0.01元 手续费。
     *
     * 总结：两种模式， 误差不会高于0.01元， 按照实际场景配置即可。
     * 提示：
     * 1. 若手续费按照那种方式计算， 服务商的退回也按照该方式进行。
     * 2. 若包含阶梯费率， 那么只能按照： BASE_FINAL_ORDER_AMOUNT 模式计算！   SPLIT_PAY_REFUND_AMOUNT模式无只适合单笔费率的计算！
     *
     *  **/
    public static final String FEE_CAL_MODEL_BASE_FINAL_ORDER_AMOUNT = "BASE_FINAL_ORDER_AMOUNT";
    public static final String FEE_CAL_MODEL_SPLIT_PAY_REFUND_AMOUNT = "SPLIT_PAY_REFUND_AMOUNT";

    private String feeCalModel;

    public static final ChannelFeeCalModel getByDefault(String val){

        if(StringUtils.isEmpty(val)){

            ChannelFeeCalModel result = new ChannelFeeCalModel();
            result.setFeeCalModel(FEE_CAL_MODEL_BASE_FINAL_ORDER_AMOUNT);
            return result;
        }

        return JSON.parseObject(val, ChannelFeeCalModel.class);
    }

}
