
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.api.payment.vo.SplitRuleVO;
import com.tmerclub.cloud.common.constant.PayType;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.vo.ShopCartOrderMergerVO;
import com.tmerclub.cloud.payment.bo.PayInfoBO;
import com.tmerclub.cloud.payment.bo.PayInfoResultBO;
import com.tmerclub.cloud.payment.dto.AccountSearchDTO;
import com.tmerclub.cloud.payment.dto.BuyVipPayInfoDTO;
import com.tmerclub.cloud.payment.dto.PayInfoDTO;
import com.tmerclub.cloud.payment.dto.RechargePayInfoDTO;
import com.tmerclub.cloud.payment.model.PayInfo;
import com.tmerclub.cloud.payment.vo.PayInfoVO;
import jakarta.servlet.http.HttpServletResponse;

import java.util.Date;
import java.util.List;

/**
 * 订单支付记录
 *
 * @author tmerclub
 * @date 2020-12-25 09:50:59
 */
public interface PayInfoService {

    /**
     * 调取微信 or 支付宝接口，创建支付订单，返回给前端，前端唤起应用进行支付
     *
     * @param userId   用户id
     * @param payParam 支付参数
     * @param bizUserId 第三方系统id
     * @return 前端唤起支付需要的参数
     */
    PayInfoBO pay(Long userId, PayInfoDTO payParam, String bizUserId);


    /**
     * 根据订单支付记录id获取订单支付记录
     *
     * @param payId 订单支付记录id
     * @return 订单支付记录
     */
    PayInfo getByPayId(Long payId);

    /**
     * 标记为支付成功
     *
     * @param payInfoResult         支付信息
     * @param temp                  支付信息
     * @param orderIds              订单ids
     * @param paySysType
     * @param shopCartOrderMergerVO
     */
    void paySuccess(PayInfoResultBO payInfoResult, PayInfo temp, List<Long> orderIds, Integer paySysType, ShopCartOrderMergerVO shopCartOrderMergerVO);

    /**
     * 根据支付订单号获取订单支付状态
     *
     * @param orderIds 订单号ids
     * @return 支付状态
     */
    Integer getPayStatusByOrderIds(String orderIds);

    /**
     * 查询订单是否已经支付
     *
     * @param orderIds      订单id
     * @param userId        用户id
     * @param payEntry      支付入口 见 com.tmerclub.cloud.payment.constant.PayEntry
     * @param payAmountType
     * @return 是否已经支付
     */
    Integer isPay(String orderIds, Long userId, Integer payEntry, Integer payAmountType);

    /**
     * 标记为退款状态
     *
     * @param payId 订单号
     */
    void markerRefund(Long payId);

    /**
     * 更新支付信息
     *
     * @param payInfo
     */
    void update(PayInfo payInfo);

    /**
     * 根据订单id，获取订单支付的信息
     *
     * @param orderIds 订单ids
     * @return 支付信息
     */
    List<PayInfo> listByOrderIds(List<Long> orderIds);


    /**
     * 调取微信 or 支付宝接口，创建充值订单，返回给前端，前端唤起应用进行支付
     *
     * @param userId   用户id
     * @param payParam 支付参数
     * @return 前端唤起支付需要的参数
     */
    PayInfoBO recharge(Long userId, RechargePayInfoDTO payParam);

    /**
     * 充值成功
     *
     * @param payInfoResult 支付信息
     * @param payType       支付方式
     * @param rechargeLogId 充值记录id
     * @param sysType       系统类型
     */
    void rechargeSuccess(PayInfoResultBO payInfoResult, PayType payType, Long rechargeLogId, Integer sysType);

    /**
     * 商家余额支付成功
     *
     * @param payInfoResult 支付信息
     * @param rechargeLogId 充值记录id
     */
    void payShopBalanceSuccess(PayInfoResultBO payInfoResult, Long rechargeLogId);

    /**
     * 进行vip购买，返回支付信息
     *
     * @param userId   用户id
     * @param payParam 支付参数
     * @return 支付信息
     */
    PayInfoBO vipBuy(Long userId, BuyVipPayInfoDTO payParam);

    /**
     * 购买会员成功
     *
     * @param payInfoResult  支付信息
     * @param payType        支付方式
     * @param userLevelLogId 会员购买记录
     */
    void buyVipSuccess(PayInfoResultBO payInfoResult, PayType payType, Long userLevelLogId);

    /**
     * 根据时间参数获取收入账户详情
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param shopName  店铺名称
     * @return 收入账户详情
     */
    AccountDetailVO getIncomeAccountDetail(Date startTime, Date endTime, String shopName);

    /**
     * 获取平台收入详情
     *
     * @param startTime
     * @param endTime
     * @return
     */
    AccountDetailVO getPlatformIncomeAccountDetail(Date startTime, Date endTime);

    /**
     * 根据时间参数获取支付详情
     *
     * @param pageDTO          分页参数
     * @param accountSearchDTO
     * @return 支付详情
     */
    PageVO<PayInfoVO> getPayInfoPage(PageDTO pageDTO, AccountSearchDTO accountSearchDTO);

    /**
     * 导出收入明细列表
     *
     * @param accountSearchDTO
     * @param response
     */
    void excelPayInfo(HttpServletResponse response, AccountSearchDTO accountSearchDTO);

    /**
     * 支付预售订单尾款
     *
     * @param userId
     * @param payParam
     * @return
     */
    PayInfoBO payPreSaleBalance(Long userId, PayInfoDTO payParam);

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

    /**
     * 通知店铺已经使用余额支付退款自行处理的费用
     *
     * @param payInfoResultBO
     * @param orderIds
     */
    void noticeShopBalancePayRefundSpread(PayInfoResultBO payInfoResultBO, Long orderIds);

    /**
     * 通知店铺已经使用余额支付退款自行处理的费用
     *
     * @param payInfoResultBO
     * @param payInfo
     */
    void noticeSettlementOrder(PayInfoResultBO payInfoResultBO, PayInfo payInfo);

    /**
     * 平台转账,通联支付独有
     *
     * @param splitRuleVO
     */
    void platformTransfer(SplitRuleVO splitRuleVO);

    /**
     * 根据用户id和订单id获取最新的支付成功记录的系统类型
     * @param orderId
     * @param userId
     * @return
     */
    List<PayInfo> getPaySystemTypeByUserIdAndOrderId(Long userId, Long orderId);

    /**
     * 更新支付成功
     * @param payInfo
     */
    void updateToSuccess(PayInfo payInfo);

}
