package com.seer.teach.pay.app.client;

import com.seer.teach.common.enums.pay.PayChannelEnum;
import com.seer.teach.pay.app.client.dto.PayOrderReqDTO;
import com.seer.teach.pay.app.client.dto.RefundNotificationRespDTO;
import com.seer.teach.pay.app.pay.controller.req.OrderPayReq;
import com.seer.teach.pay.app.client.dto.PayOrderRespDTO;
import com.seer.teach.pay.app.client.dto.PayRefundReqDTO;
import com.seer.teach.pay.dto.RefundSubmitRespDTO;
import com.seer.teach.pay.entity.PayOrderEntity;

import java.util.Map;
import java.util.Optional;

/**
 * 支付策略接口
 * 定义了支付的通用操作，不同支付方式需要实现此接口
 */
public interface PayClient {

    /**
     * 初始化支付客户端
     *
     * @param configJson 配置信息
     */
    void init(String configJson);

    /**
     * 获取支付渠道编码
     * @return 支付渠道编码（如：WECHAT、ALIPAY）
     */
    PayChannelEnum getChannel();

    /**
     * 执行支付订单
     * @param payOrderReqDTO 支付请求参数
     * @return 支付响应结果
     */
    PayOrderRespDTO payOrder(PayOrderReqDTO payOrderReqDTO);

    /**
     * 查询支付状态
     * @param orderSn 订单号
     * @return 支付订单信息
     */
    PayOrderEntity queryPayStatus(String orderSn);

    /**
     * 处理支付回调
     * @param headers 回调请求头
     * @param params 回调请求参数
     * @param body 回调请求体
     * @return PayOrderEntity
     */
    PayOrderRespDTO handlePayCallback(Map<String, String> headers, Map<String, String> params, String body);

    /**
     * 关闭支付订单
     * @param orderSn 订单号
     * @return 是否关闭成功
     */
    boolean closePayOrder(String orderSn);

    /**
     * 判断是否是异步回调
     * @return true: 异步回调, false: 同步回调
     */
    boolean isAsyncCallback();

    /**
     * 执行退款订单
     *
     * @param payRefundReqDTO 退款请求参数
     * @return 退款响应结果
     */
    RefundSubmitRespDTO refundOrder(PayRefundReqDTO payRefundReqDTO);

    /**
     * 查询退款状态
     * @param refundSn 退款单号
     * @return 退款订单信息
     */
    RefundSubmitRespDTO doQueryRefundStatus(String refundSn);

    /**
     * 处理退款回调
     * @param headers 回调请求头
     * @param params 回调请求参数
     * @param body 回调请求体
     * @return RefundSubmitRespDTO
     */
    Optional<RefundNotificationRespDTO> handleRefundCallback(Map<String, String> headers, Map<String, String> params, String body);

}