package com.sonic.lion.service;

import com.sonic.lion.domain.entity.PayCallChannelRecord;
import com.sonic.lion.domain.enums.CallChannelStatus;
import com.sonic.lion.domain.input.ChannelBindBankCardInput;
import com.sonic.lion.domain.input.ChannelCreateCustomerInput;
import com.sonic.lion.domain.input.ChannelPaymentInput;
import com.sonic.lion.domain.input.ChannelPayoutInput;
import com.sonic.lion.domain.output.*;
import com.sonic.lion.enums.BizType;
import com.sonic.lion.enums.PayChannel;
import org.springframework.lang.NonNull;

import java.util.List;

/**
 * @author: code
 * @date: 2025/05/13
 * @Description:
 * @version: 1.0.0
 */
public interface PayCallChannelService {

    /**
     * 根据主键查询
     *
     * @param id
     * @return
     */
    PayCallChannelRecord get(Long id);

    /**
     * 根据tradeNo查询该笔交易最后一次调用支付渠道的记录
     *
     * @param tradeNo
     * @param bizType
     * @return
     */
    PayCallChannelRecord getByTradeNoAndBizTypeLast(String tradeNo, BizType bizType);

    /**
     * 检查未确定的调用
     */
    @Deprecated
    List<PayCallChannelRecord> waitCheckRecord();

    /**
     * 调用支付渠道提现
     *
     * @param input
     */
    ChannelPayoutOutput callPayout(@NonNull ChannelPayoutInput input);

    /**
     * web支付
     *
     * @param input
     */
    ChannelPaymentOutput callPayment(@NonNull ChannelPaymentInput input);

    /**
     * @param id
     * @param status
     * @param expectStatus
     * @return
     */
    void updateStatus(@NonNull Long id, @NonNull CallChannelStatus status, @NonNull CallChannelStatus expectStatus);

    /**
     * 计算手续费
     *
     * @param amount
     * @param payChannel
     * @param bizType
     * @return
     */
    Long calculateFee(@NonNull Long amount, @NonNull PayChannel payChannel, @NonNull BizType bizType);

    /**
     * 计算平台抽成
     * @param amount
     * @param bizType
     * @return
     */
    Long calculatePlatformFee(@NonNull Long amount, @NonNull BizType bizType);

    /**
     * 调用渠道创建customer
     *
     * @param input
     */
    ChannelCreateCustomerOutput callCreateCustomer(@NonNull ChannelCreateCustomerInput input);

    /**
     * 检查调用记录
     *
     * @param record
     * @return
     */
    ChannelCheckOutput checkRecord(PayCallChannelRecord record);

    /**
     * 调用支付渠道绑定银行卡
     *
     * @param input
     * @return
     */
    ChannelBindBankCardOutput callBindBankCard(@NonNull ChannelBindBankCardInput input);

    /**
     * 保存 调用结果
     *
     * @param payCallChannelRecord
     */
    void save(PayCallChannelRecord payCallChannelRecord);

    /**
     * 保存渠道账单
     *
     * @param record
     */
    void saveChannelBill(PayCallChannelRecord record);
}
