package org.dromara.pay.core;

import jakarta.servlet.http.HttpServletRequest;
import org.dromara.pay.domain.PayChannel;
import org.dromara.pay.domain.PayOrder;
import org.dromara.pay.domain.PayRefund;
import org.dromara.pay.domain.vo.PayNotifyResult;
import org.dromara.pay.domain.vo.PayOrderSubmitRespVO;

/**
 * 支付策略接口
 *
 * @author pengles
 */
public interface PayStrategy {

    /**
     * 统一下单
     *
     * @param order   支付订单
     * @param channel 支付渠道
     * @return 提交响应
     */
    PayOrderSubmitRespVO unifiedOrder(PayOrder order, PayChannel channel);

    /**
     * 退款
     *
     * @param refund  退款订单
     * @param channel 支付渠道
     * @return 是否提交成功
     */
    Boolean refund(PayRefund refund, PayChannel channel);

    /**
     * 查询订单状态
     *
     * @param order   支付订单
     * @param channel 支付渠道
     * @return 渠道订单状态 (映射到 PayOrderStatusEnum)
     */
    Integer queryOrder(PayOrder order, PayChannel channel);

    /**
     * 关闭订单
     *
     * @param order   支付订单
     * @param channel 支付渠道
     * @return 是否关闭成功
     */
    Boolean closeOrder(PayOrder order, PayChannel channel);

    /**
     * 查询退款状态
     *
     * @param refund  退款订单
     * @param channel 支付渠道
     * @return 退款状态
     */
    Integer queryRefund(PayRefund refund, PayChannel channel);

    /**
     * 处理回调通知
     *
     * @param request HTTP请求
     * @param channel 支付渠道
     * @return 处理结果
     */
    PayNotifyResult processNotify(HttpServletRequest request, PayChannel channel);
}
