package com.sonic.lion.service;

import com.sonic.lion.domain.bo.SubscriptionBo;
import com.sonic.lion.domain.bo.WebhookBo;
import com.sonic.lion.domain.input.*;
import com.sonic.lion.domain.output.*;
import org.springframework.lang.NonNull;

import java.math.BigDecimal;

/**
 * @author: code
 * @date: 2025/05/08
 * @Description:
 * @version: 1.0.0
 */
public interface PayChannelService {

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

    /**
     * 付款
     *
     * @param input
     */
    ChannelPayoutOutput payout(@NonNull ChannelPayoutInput input);

    /**
     * 计算提现手续费
     *
     * @param occurAmount
     * @return
     */
    Long calculateWithdrawFee(@NonNull Long occurAmount);

    /**
     * 检查付款请求
     *
     * @param channelSn
     * @return
     */
    ChannelCheckOutput checkPayout(String channelSn);

    /**
     * 检查收款请求
     *
     * @param input
     * @return
     */
    ChannelCheckOutput checkPayment(@NonNull ChannelCheckPaymentInput input);

    /**
     * 检查退款请求
     *
     * @param input
     * @return
     */
    ChannelCheckOutput checkRefund(@NonNull ChannelCheckRefundInput input);

    /**
     * 创建用户的订阅付款链接
     * @param priceId
     * @param customerId
     * @param successUrl
     * @param cancelUrl
     * @param trialPeriodDays
     * @return
     */
    ChannelPaymentOutput createSubPayment(String priceId, String customerId, String successUrl, String cancelUrl, Long trialPeriodDays);

    /**
     * 查询用户的订阅付款链接
     * @param sessionId
     * @return
     */
    String retrieveSessionUrl(String sessionId);

    /**
     * 查询用户的订阅付款列表
     * @param input
     * @return
     */
    SubscriptionBo checkSubPayment(ChannelSubPayoutInput input);

    /**
     * 计算支付手续费
     *
     * @param productAmount
     * @return
     */
    Long calculatePaymentFee(@NonNull Long productAmount);

    /**
     * 为用户创建三方账户
     *
     * @return
     */
    ChannelCreateCustomerOutput createCustomer(@NonNull ChannelCreateCustomerInput input);

    /**
     * 取消交易
     *
     * @param transactionId
     */
    ChannelCancelOutput cancel(@NonNull String transactionId);

    /**
     * 全额退款
     *
     * @param input
     */
    ChannelRefundOutput refund(@NonNull ChannelRefundInput input);

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

    /**
     * 绑定Paypal账号
     *
     * @param input
     * @return
     */
    ChannelBindPaypalOutput bindPayPal(@NonNull ChannelBindPaypalInput input);

    /**
     * 绑定银行账户
     *
     * @param input
     * @return
     */
    ChannelBindBankAccountOutput bindBankAccount(@NonNull ChannelBindBankAccountInput input);

    /**
     * 获取付款手续费基数
     *
     * @return
     */
    Long getPaymentFeeBase();

    /**
     * 获取付款手续费费率
     *
     * @return
     */
    BigDecimal getPaymentFeeRate();

    /**
     * webhook前置处理，解析、校验签名
     * @param input
     * @param webhookSecret
     * @return
     */
    WebhookBo webhookBeforeHandler(@NonNull ChannelWebhookInput input, String webhookSecret);

    /**
     * webhook后置处理
     *
     * @param input
     * @return
     */
    ChannelWebhookOutput webhookAfterHandler(@NonNull ChannelWebhookInput input) throws Exception;
}
