package com.haha.service.payment;

import com.haha.common.enums.PaymentChannel;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 支付业务门面服务
 * 上层代码统一通过此接口调用支付功能，无需关心具体支付渠道实现
 */
public interface PaymentService {
    
    /**
     * 创建支付
     * @param orderId 本地订单ID
     * @param channel 支付渠道
     * @param extra 扩展参数（如openId, buyerId等）
     * @return 支付结果（含前端调起支付所需参数）
     */
    PaymentResult createPayment(Long orderId, PaymentChannel channel, Map<String, String> extra);
    
    /**
     * 创建支付（从Map params提取参数）
     * @param params 包含 orderId、channel、openId（可选）、buyerId（可选）
     * @return 支付结果
     */
    PaymentResult createPayment(Map<String, Object> params);

    /**
     * 退款
     * @param orderId 本地订单ID
     * @param reason 退款原因
     * @return 退款结果
     */
    RefundResult refund(Long orderId, String reason);

    /**
     * 退款（指定退款金额）
     * @param orderId 本地订单ID
     * @param reason 退款原因
     * @param refundAmount 退款金额（null则全额退款）
     * @return 退款结果
     */
    RefundResult refund(Long orderId, String reason, BigDecimal refundAmount);

    /**
     * 退款（从Map params提取orderId和reason）
     * @param params 包含 orderId、reason（可选）、products（可选）、refundAmount（可选）
     * @return 退款结果
     */
    RefundResult refund(Map<String, Object> params);
    
    /**
     * 处理支付回调
     * @param channel 支付渠道
     * @param params 回调参数
     * @return 回调处理结果
     */
    PaymentCallbackResult handleCallback(PaymentChannel channel, Map<String, Object> params);
    
    /**
     * 查询支付状态
     * @param orderId 本地订单ID
     * @return 支付结果
     */
    PaymentResult queryPaymentStatus(Long orderId);
    
    /**
     * 获取当前可用的支付渠道列表
     */
    List<PaymentChannel> getAvailableChannels();

    /**
     * 获取可用支付渠道列表（转换为前端所需格式）
     * @return [{code: "wechat", name: "微信支付"}, ...]
     */
    List<Map<String, String>> getChannelList();
}
