package shop.alien.dining.strategy.payment;

import shop.alien.entity.result.R;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 支付策略接口
 *
 * @author ssk
 * @version 1.0
 * @date 2024/12/4
 */
public interface PaymentStrategy {
    /** 生成预支付订单（本系统调用时需传 storeId 以从 MySQL 获取店铺支付配置）
     *
     * @param price 订单金额
     * @param subject 订单标题
     * @param payer 支付者 openid
     * @param orderNo 订单号
     * @param storeId 店铺ID，本系统调用时必传，用于获取 StorePaymentConfig
     * @return 预支付订单信息
     * @throws Exception 生成异常
     */
    R createPrePayOrder(String price, String subject, String payer, String orderNo, Integer storeId, Integer couponId, Integer payerId,String serviceFee,String discountAmount,String payAmount) throws Exception;


    /**
     * 处理支付通知
     *
     * @param notifyData 支付通知数据
     * @return 处理结果
     * @throws Exception 处理异常
     */
    R handleNotify(String notifyData, HttpServletRequest request) throws Exception;

    /**
     * 查询订单状态（本系统调用时需传 storeId 以获取店铺支付配置）
     *
     * @param transactionId 交易订单号
     * @param storeId 店铺ID，本系统调用时必传
     * @return 订单状态信息
     * @throws Exception 查询异常
     */
    R searchOrderByOutTradeNoPath(String transactionId, Integer storeId) throws Exception;

    /**
     * 处理退款请求
     *
     * @param params 退款请求参数
     * @return 处理结果
     * @throws Exception 处理异常
     */
    String handleRefund(Map<String,String> params) throws Exception;

    /**
     * 查询退款记录（本系统调用时需传 storeId 以获取店铺支付配置）
     *
     * @param outRefundNo 退款订单号
     * @param storeId 店铺ID，本系统调用时必传
     * @return 退款记录信息
     * @throws Exception 查询异常
     */
    R searchRefundRecordByOutRefundNo(String outRefundNo, Integer storeId) throws Exception;


    /**
     * 获取策略类型字符串
     *
     * @return 策略类型字符串
     */
    String getType();
}

