import type { Ref } from 'vue'
import type { FetchContext, FetchOptions } from 'ofetch'
import ApiRequestService from '~/services/data/apiRequestService'

/**
 * Retourne une instance de ApiRequestService configurée pour interroger l'api Maestro
 *
 * @see https://github.com/unjs/ohmyfetch/blob/main/README.md#%EF%B8%8F-create-fetch-with-default-options
 */
let apiRequestServiceClass: null | ApiRequestService = null

export const useMaestroRequestService = () => {
  const runtimeConfig = useRuntimeConfig()

  const baseURL = runtimeConfig.apiBaseUrl ?? runtimeConfig.public.apiBaseUrl

  const pending: Ref<boolean> = ref(false)

  /**
   * Peuple les headers avant l'envoi de la requête
   *
   * @param request
   * @param options
   */
  const onRequest = function ({ request, options }: FetchContext) {
    // @ts-ignore
    if (options && options.noXaccessId) {
      return
    }

    pending.value = true
    console.log('Request : ' + request + ' (SSR: ' + process.server + ')')
  }

  const onResponse = function (_: FetchContext) {
    pending.value = false
  }

  /**
   * Gère les erreurs retournées par l'api
   *
   * @param request
   * @param response
   * @param error
   */

  const config: FetchOptions = {
    baseURL,
    onRequest,
    onResponse,
  }

  // Avoid memory leak
  if (apiRequestServiceClass === null) {
    // Utilise la fonction `create` d'ohmyfetch pour générer un fetcher dédié à l'interrogation de Ap2i
    const fetcher = $fetch.create(config)
    // @ts-ignore
    apiRequestServiceClass = new ApiRequestService(fetcher)
  }

  return { apiRequestService: apiRequestServiceClass, pending }
}
