import { $fetch } from 'ofetch'

/**
 * Options d'un appel HTTP externe.
 */
export interface HttpExternalOptions {
    /** Parametres de query string (encodes par ofetch). */
    query?: Record<string, string | number | undefined>
    /** Timeout en millisecondes avant abandon (defaut 5000). */
    timeoutMs?: number
}

/**
 * Petit client HTTP pour les APIs PUBLIQUES EXTERNES (domaine tiers, hors `/api`).
 *
 * Pourquoi un helper dedie plutot que `useApi()` : `useApi()` est le client de
 * l'API interne Starseed (baseURL `/api`, cookie JWT `credentials: 'include'`,
 * parsing/erreurs Hydra, redirection `/login` sur 401, toasts i18n). Tout cela
 * est inadapte — voire indesirable — pour un endpoint public externe comme la
 * Base Adresse Nationale (`api-adresse.data.gouv.fr`).
 *
 * Ce helper est donc le SEUL point d'entree autorise pour un `$fetch` brut vers
 * l'externe (cf. regle frontend n°4 : pas de `$fetch` eparpille dans les
 * composants). Il :
 * - cible une URL absolue (pas de baseURL `/api`) ;
 * - n'envoie PAS le cookie de session (`credentials: 'omit'`) ;
 * - ne retente pas (`retry: 0`) et applique un timeout ;
 * - laisse remonter l'erreur (throw) — au consommateur de gerer le mode degrade.
 */
export async function httpExternal<T>(
    url: string,
    opts: HttpExternalOptions = {},
): Promise<T> {
    return $fetch<T>(url, {
        query: opts.query,
        credentials: 'omit',
        retry: 0,
        timeout: opts.timeoutMs ?? 5000,
    })
}
