package com.yn.bftl.thirdparty.modules.business.service;

import com.yn.bftl.common.modules.account.enums.PaymentType;
import com.yn.bftl.common.modules.order.entity.Order;
import com.yn.bftl.common.modules.order.enums.PosPaymentType;
import com.yn.bftl.common.modules.subaccount.entity.SubaccountRefund;
import com.yn.bftl.thirdparty.modules.unionpay.enums.UnionpayAppOrderType;
import com.yn.bftl.thirdparty.modules.unionpay.vo.callback.SettlementCallbackVO;

import java.util.List;

/**
 * 分账服务
 *
 * @author huabiao
 * @create 2022/9/14  17:21
 **/
public interface SubaccountService {

    /**
     * 临时结算单-根据订单创建
     *
     * @param orderId:订单ID
     * @author huabiao
     * @create 2022/9/19  11:32
     */
    void generateTemporaryStatement(Long orderId);

    /**
     * 结算单-根据订单创建
     * <p>自制商品则直接进行分账，故这里直接使用订单生成结算单</p>
     *
     * @param orderId:订单ID
     * @author huabiao
     * @create 2022/9/2  14:39
     */
    void generateStatementByOrder(Long orderId);

    /**
     * 结算单-根据发货单创建
     * <p>OEM订单需收货后进行分账，故这里以发货单进行结算</p>
     * <p>当为分批发货时，应在最后一次发货时将差额补齐</p>
     *
     * @param shippingId:发货单ID
     * @author huabiao
     * @create 2022/9/2  14:39
     */
    void generateStatementByShipping(Long shippingId);

    /**
     * 结算单-根据是售后单创建
     *
     * @param afterSaleId:售后单ID
     * @author huabiao
     * @create 2022/9/19  21:22
     */
    void generateStatementByAfterSale(Long afterSaleId);

    /**
     * 创建支付单
     *
     * @param order       订单
     * @param paymentType
     * @param type
     * @param unionpaySn
     * @param payType
     * @param hardwareSn  pos机硬件序列号
     * @return
     * @description
     * @author huabiao
     * @create 2022/9/15  20:59
     */
    String createPayment(Order order, PaymentType paymentType, UnionpayAppOrderType type, String unionpaySn, PosPaymentType payType, String hardwareSn);


    /**
     * 分账单-根据订单生成
     *
     * @param orderId:订单ID
     * @author huabiao
     * @create 2022/9/22  11:26
     */
    void generateSubaccountByOrder(Long orderId);

    /**
     * 分账单-根据发货单生成
     *
     * @param shippingId:发货单ID
     * @author huabiao
     * @create 2022/9/24  15:10
     */
    void generateSubaccountByShipping(Long shippingId);

    /**
     * 分账单-处理
     *
     * @param settlementCallbackVO:结算单回调数据
     * @author huabiao
     * @create 2022/9/23  14:45
     */
    void handleSubaccount(SettlementCallbackVO settlementCallbackVO);

    /**
     * 品牌授权费-处理
     * <p>因品牌授权费分摊金额错误，这里补全原本的金额</p>
     *
     * @param subaccountNo 分账单号
     * @author huabiao
     * @create 2023/3/22  15:08
     */
    void handleBrandAuthFee(String subaccountNo);

    /**
     * 结算单-根据退款单生成
     *
     * @param orderId 订单ID
     * @author huabiao
     * @create 2023/4/3  21:13
     */
    void generateStatementByOrderRefund(Long orderId);

    /**
     * 货款-处理
     * <p>补全货款的金额</p>
     * <p>因品牌授权费计算有误导致金额计算错误</p>
     *
     * @param subaccountNo    分账啊单号
     * @param orderItemIdList 处理的订单项ID
     * @author huabiao
     * @create 2023/4/6  0:43
     */
    void handleGoodsCost(String subaccountNo, List<Long> orderItemIdList);

    /**
     * 退款分账处理
     * <p>1、生成退款分帐单</p>
     * <p>2、供应商账户处理</p>
     * <p>3、经销商账户处理</p>
     *
     * @param subaccountRefund 退款分账单
     * @author huabiao
     * @create 2023/4/26  16:09
     */
    void generateRefundSubaccount(SubaccountRefund subaccountRefund);


}
