package com.ruoyi.ss.payBill.service;

import com.ruoyi.ss.payBill.domain.PayBill;
import com.ruoyi.ss.payBill.domain.PayBillQuery;
import com.ruoyi.ss.payBill.domain.PayBillVO;
import com.ruoyi.ss.payBill.domain.dto.PayBillRefundDTO;
import com.ruoyi.ss.payBill.domain.vo.DoPayVO;
import com.ruoyi.ss.refund.domain.RefundVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 支付订单Service接口
 *
 * @author ruoyi
 * @date 2024-07-24
 */
public interface PayBillService
{
    /**
     * 查询支付订单
     *
     * @param payId 支付订单主键
     * @return 支付订单
     */
    public PayBillVO selectPayBillByPayId(Long payId);

    /**
     * 查询支付订单列表
     *
     * @param payBill 支付订单
     * @return 支付订单集合
     */
    public List<PayBillVO> selectPayBillList(PayBillQuery payBill);

    /**
     * 新增支付订单
     *
     * @param payBill 支付订单
     * @return 结果
     */
    public int insertPayBill(PayBill payBill);

    /**
     * 修改支付订单
     *
     * @param payBill 支付订单
     * @return 结果
     */
    public int updatePayBill(PayBill payBill);

    /**
     * 批量删除支付订单
     *
     * @param payIds 需要删除的支付订单主键集合
     * @return 结果
     */
    public int deletePayBillByPayIds(Long[] payIds);

    /**
     * 删除支付订单信息
     *
     * @param payId 支付订单主键
     * @return 结果
     */
    public int deletePayBillByPayId(Long payId);

    /**
     * 创建支付订单
     */
    void createPayBill(PayBill bill);

    /**
     * 根据业务ID关闭订单
     *
     * @param orderNo   业务ID
     */
    boolean closeByOrderNo(String orderNo);

//    /**
//     * 根据业务ID查询
//     */
//    List<PayBillVO> selectByBstId(Long bstId, String bstType);

    /**
     * 根据支付订单编号查询
     */
    PayBillVO selectByPayNo(String payNo);

    /**
     * 根据条件更新
     */
    int updateByQuery(PayBill data, PayBillQuery query);

    /**
     * 记录（转移）已退款金额
     */
    int recordRefundAmount(Long payId,BigDecimal amount);

    /**
     * 处理支付成功时间
     * @param payNo 支付订单编号
     * @param payTime 支付成功的时间
     */
    void handleSuccess(String payNo, LocalDateTime payTime);

    /**
     * 刷新支付结果
     */
    int refreshPayResult(List<PayBillVO> payList);

    /**
     * 刷新支付结果
     */
    int refreshPayResult(String payNo);

//    /**
//     * 支付订单退款
//     */
//    int refund(PayBillRefundDTO dto);

    /**
     * 处理退款成功事件
     */
    int handleRefundSuccess(RefundVO refund);

    /**
     * 添加退款中金额
     */
    int addRefundingAmount(Long payId, BigDecimal amount);


    /**
     * 延迟刷新支付结果，直到成功或者超过最大次数
     * @param pay 支付单
     * @param delay 延迟时间
     * @param timeUnit 延迟时间单位
     * @param count 最大次数
     */
    void refreshPayResultMaxCount(PayBillVO pay, long delay, TimeUnit timeUnit, int count);

    /**
     * 按条件查询渠道成本
     */
    BigDecimal selectSumOfChannelCost(PayBillQuery query);

}
