package shop.alien.store.strategy.payment;


import shop.alien.entity.result.R;

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

/**
 * 支付策略接口
 *
 * @author lyx
 * @date 2025/11/20
 */
public interface PaymentStrategy {

    /** 生成预支付订单
     *
     * @param price 订单金额
     * @param subject 订单标题
     * @return 预支付订单信息
     * @throws Exception 生成异常
     */
    R createPrePayOrder(String price, String subject) throws Exception;


    R createPreAliPayOrder(String orderId, String amount, String subject, String smid) throws Exception;

    /**
     * 创建预支付订单（可选门店维度：微信服务商等策略需传 storeId 以解析子商户号）
     *
     * @param storeId 门店主键，非服务商策略可忽略
     */
    default R createPrePayOrder(String price, String subject, Integer storeId) throws Exception {
        return createPrePayOrder(price, subject);
    }

    /**
     * 创建预支付订单（扩展参数：与点餐小程序服务商策略对齐，用于绑定业务订单号、回写 store_order）
     * <p>
     * 默认实现忽略扩展字段，仅调用 {@link #createPrePayOrder(String, String, Integer)}。
     * </p>
     *
     * @param payer         预留（APP 服务商下单可不传）
     * @param orderNo       业务订单号，有值时尝试关联 store_order
     * @param couponId      优惠券
     * @param payerId       支付用户
     * @param serviceFee    服务费（与接口层 tablewareFee 等含义对齐时由调用方传入）
     * @param discountAmount 优惠金额
     * @param payAmount     实付金额
     */
    default R createPrePayOrder(String price, String subject, String payer, String orderNo, Integer storeId,
                                Integer couponId, Integer payerId, String serviceFee, String discountAmount,
                                String payAmount) throws Exception {
        return createPrePayOrder(price, subject, storeId);
    }

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

    /**
     * 处理支付通知（微信 APIv3 需从请求头读取 Wechatpay-Serial 等参与验签）
     * <p>默认实现转调 {@link #handleNotify(String)}。</p>
     */
    default R handleNotify(String notifyData, HttpServletRequest request) throws Exception {
        return handleNotify(notifyData);
    }

     /**
     * 查询订单状态
     *
     * @param transactionId 交易订单号
     * @return 订单状态信息
     * @throws Exception 查询异常
     */
    R searchOrderByOutTradeNoPath(String transactionId) throws Exception;

    /**
     * 按商户订单号查单（可选门店维度：微信服务商需传 storeId 以解析子商户号）
     */
    default R searchOrderByOutTradeNoPath(String transactionId, Integer storeId) throws Exception {
        return searchOrderByOutTradeNoPath(transactionId);
    }

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

     /**
     * 查询退款记录
     *
     * @param outRefundNo 退款订单号
     * @return 退款记录信息
     * @throws Exception 查询异常
     */
    R searchRefundRecordByOutRefundNo(String outRefundNo ) throws Exception;

    /**
     * 创建预支付订单（可选门店维度：支付宝服务商等策略需传 storeId 以解析子商户号）
     *
     * @param
     */
    default R createPreAliPayOrder(String orderId, String amount, String subject, String smid, Integer storeId) throws Exception {
        return createPreAliPayOrder(orderId, amount, subject, smid);
    }


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