package com.sonic.lion.service;

import com.sonic.lion.domain.entity.PayTrade;
import com.sonic.lion.domain.enums.CoinType;
import com.sonic.lion.domain.enums.TradeEvent;
import com.sonic.lion.domain.input.CheckoutInput;
import com.sonic.lion.domain.input.PlatformGiftInput;
import com.sonic.lion.domain.input.PrePaymentInput;
import com.sonic.lion.domain.output.PrePaymentOutput;
import com.sonic.lion.domain.output.TradeHandleOutput;
import com.sonic.lion.domain.req.RefundReq;
import com.sonic.lion.domain.resp.CheckoutResp;
import com.sonic.lion.enums.PayChannel;
import com.sonic.lion.enums.TradeStatus;
import org.springframework.lang.NonNull;

/**
 * 交易
 */
public interface PayTradeService {

    /**
     * 根据tradeNo获取PayTrade
     *
     * @param tradeNo
     * @return
     */
    PayTrade getByTradeNo(String tradeNo);

    /**
     * 预支付
     *
     * @param input
     * @return
     */
    PrePaymentOutput prePayment(@NonNull PrePaymentInput input);

    /**
     * 收银台确认支付
     *
     * @param input
     */
    CheckoutResp checkout(@NonNull CheckoutInput input);


    /**
     * 渠道处理成功后系统内处理
     *
     * @param payTrade
     * @param tradeEvent
     */
    TradeHandleOutput tradeHandle(@NonNull PayTrade payTrade, @NonNull TradeEvent tradeEvent);

    /**
     * 渠道处理成功后系统内处理
     *
     * @param payChannel
     * @param tradeNo
     * @param tradeEvent
     */
    TradeHandleOutput tradeHandleV2(PayChannel payChannel, @NonNull String tradeNo, @NonNull TradeEvent tradeEvent);

    /**
     * 退款
     *
     * @param req
     */
    void refund(@NonNull RefundReq req);

    /**
     * 通过平台和外部订单号查询
     *
     * @param platform
     * @param outTradeNo
     * @return
     */
    PayTrade getByPlatformAndOuterTradeNo(String platform, String outTradeNo);

    /**
     * 完成担保交易
     *
     * @param platform
     * @param outTradeNo
     */
    void completeSecuredTrade(@NonNull String platform, @NonNull String outTradeNo);

    /**
     * 关闭交易
     *
     * @param platform
     * @param outTradeNo
     */
    void closeTrade(@NonNull String platform, @NonNull String outTradeNo);

    /**
     * 批量关闭交易(交易关闭时间小于当前时间的交易)
     *
     * @return
     */
    int closeWaitPayTrade();

    /**
     * 更新交易状态
     *
     * @param id
     * @param status
     * @param expectStatus
     */
    void updateStatus(Long id, TradeStatus status, TradeStatus expectStatus);

    /**
     * 更新支付信息
     *
     * @param input
     * @param payTrade
     * @param fee
     */
    void updatePaymentInfo(CheckoutInput input, PayTrade payTrade, long fee);

    /**
     * 获取待入帐转入可现的时间
     *
     * @param userId
     * @return
     */
    int getToWithdrawableIncomeTime(Long userId, CoinType coinType);

    /**
     * 平台赠送buff
     *
     * @param req
     * @return
     */
    PayTrade platformGift(PlatformGiftInput req);

}
