package com.czg.service.order.service;

import com.czg.enums.CzgPayEnum;
import com.czg.order.dto.LtPayOtherDTO;
import com.czg.order.entity.OrderPayment;
import com.czg.pay.CzgPayBaseReq;
import com.czg.pay.CzgRefundReq;
import com.czg.pay.QueryOrderRespDTO;
import com.czg.pay.RefundRespDTO;
import com.czg.resp.CzgResult;
import lombok.NonNull;

import java.math.BigDecimal;
import java.util.Map;


/**
 * 支付
 *
 * @author ww
 */
public interface PayService {
    BigDecimal MONEY_RATE = new BigDecimal("100");


    Long initPayment(OrderPayment payment);

    //-----------------------------------------------------------------付款 ----------------------------------------------------------
    CzgResult<Map<String, Object>> pay(@NonNull Long shopId, CzgPayEnum payType, CzgPayBaseReq bizData);
    //-----------------------------------------------------------------积分商品/拼团 付款 ----------------------------------------------------------

    /**
     *
     * @param param 支付参数
     * @param payType {@link com.czg.constants.PayTypeConstants.SourceType} 常量
     * @param detail  操作描述 如 积分商品购买 / 拼团商品购买
     */
    CzgResult<Map<String, Object>> ltPayOther(LtPayOtherDTO param, String payType, String detail);

    //-----------------------------------------------------------------退款-----------------------------------------------------------------


    /**
     * 退款
     * 目前订单 会员 使用
     */
    CzgResult<RefundRespDTO> refund(@NonNull Long shopId, CzgRefundReq bizData);
    /**
     * 统一退款接口
     * 目前 拼团商品  积分商品  套餐推广 使用
     * @param refPayOrderNo 自定义退单号 {@link com.czg.enums.OrderNoPrefixEnum} + 雪花Id
     */
    void unifyRefund(Long shopId, Long sourceId, Long payOrderId, String refPayOrderNo, String refundReason, BigDecimal refundAmount);
    /**
     * 退款补偿使用
     * 目前 拼团商品  积分商品  套餐推广 使用
     * (退款 账户余额不足时 会失败定时任务)
     */
    void unifyRefund(OrderPayment payment, String refPayOrderNo);


    //-----------------------------------------------------------------支付查询 ----------------------------------------------------------

    /**
     * 支付查询
     *
     * @param payOrderId 平台订单号
     * @param mchOrderNo 商户订单号
     */
    CzgResult<QueryOrderRespDTO> queryPayOrder(Long shopId, String payOrderId, String mchOrderNo, String platform);

    /**
     * 退款查询
     *
     * @param mchRefundNo   商户退款订单号 二选一
     * @param refundOrderId 平台退款订单号 二选一
     */
    CzgResult<RefundRespDTO> queryRefund(Long shopId, String mchRefundNo, String refundOrderId);
}
