/**
 * 前端 Logic 用 HTTP 请求插件（兜底单例）。
 * 正常情况下 LogicRunner.executeLogic 会为每次执行注入绑定了 abortSignal 的专属 http 插件，
 * 此单例仅作为未通过 LogicRunner 调用时的降级处理。
 */
import { post as postRequest, get as getRequest } from '@vue2-client/services/api/restTools'

export default class HttpTools {
  static instance

  constructor () {
    if (HttpTools.instance) {
      return HttpTools.instance
    }
    HttpTools.instance = this
  }

  static getInstance () {
    if (!HttpTools.instance) {
      HttpTools.instance = new HttpTools()
    }
    return HttpTools.instance
  }

  /**
   * POST 请求，返回 Promise<响应体>（即 response.data）
   * @param {string} url 请求地址
   * @param {Object} body 请求体
   * @param {Object} [config] 可选，axios 配置
   * @returns {Promise<*>}
   */
  post (url, body, config) {
    const finalConfig = { ...config, dedupe: false }
    return postRequest(url, body || {}, finalConfig)
      .then(res => res && res.data !== undefined ? res.data : res)
  }

  /**
   * GET 请求，返回 Promise<响应体>（即 response.data）
   * @param {string} url 请求地址
   * @param {Object} [params] 查询参数
   * @param {Object} [config] 可选，axios 配置
   * @returns {Promise<*>}
   */
  get (url, params, config) {
    const finalConfig = { ...config, dedupe: false }
    return getRequest(url, params, finalConfig)
      .then(res => res && res.data !== undefined ? res.data : res)
  }
}
