// Rendu lisible d'un Problem Details RFC 9457 **côté navigateur** : le pendant client de
// `parseProblem` (`lib/api-error.ts`), qui dépend de `node:http` et ne peut pas être importé
// dans un composant client. Deux appelants : l'upload direct (décision n°8) et le
// téléchargement d'`errors.csv`, les deux seuls endroits où une réponse d'erreur atteint le
// navigateur sans passer par une Server Action.

/**
 * Repli quand l'api n'a pas mis de `detail` : le code de statut ne veut rien dire pour
 * l'utilisateur, la phrase si. `410` est le cas réel du module Imports — les fichiers
 * d'import sont purgés à 30 jours (décision n°7), et « expiré » n'est pas « jamais existé ».
 */
const STATUS_FALLBACKS: Record<number, string> = {
  401: "Session expirée : rechargez la page pour vous reconnecter.",
  404: "Ressource introuvable.",
  410: "Ce fichier a expiré : les fichiers d'import sont purgés au bout de 30 jours.",
  413: "Fichier trop volumineux.",
};

/** Message affichable pour une réponse d'erreur, quel que soit le corps rendu. */
export function problemMessage(status: number, body: string): string {
  try {
    const parsed = JSON.parse(body) as { title?: unknown; detail?: unknown };
    if (typeof parsed.detail === "string" && parsed.detail !== "") return parsed.detail;
    if (typeof parsed.title === "string" && parsed.title !== "") return parsed.title;
  } catch {
    // Corps non JSON (page d'erreur d'un proxy, corps vide) : le repli fait le travail.
  }
  return STATUS_FALLBACKS[status] ?? `La requête a échoué (HTTP ${status}).`;
}
