
package com.tmerclub.cloud.payment.service;

import com.tmerclub.cloud.api.payment.vo.AccountDetailVO;
import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.bo.PayRefundBO;
import com.tmerclub.cloud.payment.dto.AccountSearchDTO;
import com.tmerclub.cloud.payment.model.PayInfo;
import com.tmerclub.cloud.payment.model.RefundInfo;
import com.tmerclub.cloud.payment.vo.RefundInfoVO;
import jakarta.servlet.http.HttpServletResponse;

import java.util.Date;

/**
 * 退款信息
 *
 * @author tmerclub
 * @date 2021-03-11 14:45:01
 */
public interface RefundInfoService {

    /**
     * 分页获取退款信息列表
     * @param pageDTO 分页参数
     * @return 退款信息列表分页数据
     */
    PageVO<RefundInfo> page(PageDTO pageDTO);

    /**
     * 根据退款信息id获取退款信息
     *
     * @param refundId 退款信息id
     * @return 退款信息
     */
    RefundInfo getByRefundIdAndWxPay(Long refundId);
    /**
     * 根据退款信息id获取退款信息
     *
     * @param refundId 退款信息id
     * @return 退款信息
     */
    RefundInfo getByRefundId(Long refundId);

    /**
     * 保存退款信息
     * @param refundInfo 退款信息
     */
    void save(RefundInfo refundInfo);

    /**
     * 更新退款信息
     * @param refundInfo 退款信息
     */
    void update(RefundInfo refundInfo);

    /**
     * 根据退款信息id删除退款信息
     * @param refundId 退款信息id
     */
    void deleteById(Long refundId);

    /**
     * 执行退款
     * @param payRefundBO
     */
    void doRefund(PayRefundBO payRefundBO);

    /**
     * 退款成功，通知各个服务
     * @param refundInfo
     */
    void refundSuccess(RefundInfo refundInfo);

    /**
     * 根据时间参数获取退款账户详情
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param shopName
     * @return 退款账户详情
     */
    AccountDetailVO getRefundAccountDetail(Date startTime, Date endTime, String shopName);

    /**
     * 获取平台退款详情
     * @param startTime
     * @param endTime
     * @return
     */
    AccountDetailVO getPlatformRefundAccountDetail(Date startTime, Date endTime);

    /**
     * 根据参数获取退款详情
     * @param pageDTO 分页参数
     * @param accountSearchDTO
     * @return 退款详情
     */
    PageVO<RefundInfoVO> getRefundInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO);

    /**
     * 获取退款对账列表
     * @param accountSearchDTO
     * @param response
     */
    void excelRefundInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO);

    /**
     * 根据时间参数分页获取收入账户详情
     * @param pageDTO
     * @param accountSearchDTO
     * @return
     */
    PageVO<ShopAccountDetailVO> pageRefundAccountDetail(PageDTO pageDTO, AccountSearchDTO accountSearchDTO);

    /**
     * 支付金额不对，进行退款
     *
     * @param payInfo
     * @param payRefundBO
     */
    void doRefundByAmountError(PayInfo payInfo, PayRefundBO payRefundBO);

    /**
     * 根据payId更新退款信息
     * @param refundInfo
     */
    void updateByIdPayId(RefundInfo refundInfo);

}
