"use client"

import { useEffect, useState } from "react"

/** Clé partagée avec la navbar, la page de connexion et l'administration. */
export const SAR_USER_KEY = "sar_user"
const SAR_TOKEN_KEY = "sar_token"

/**
 * Vrai lorsqu'une session est ouverte sur ce navigateur.
 *
 * La lecture se fait après le montage : le localStorage n'existe pas côté
 * serveur, et trancher avant l'hydratation ferait diverger les deux rendus.
 *
 * Ce que rend cette fonction commande l'apparence, jamais l'accès : le contenu
 * du localStorage se modifie depuis la console du navigateur. Seules les routes
 * appelées décident de ce qu'elles acceptent.
 */
export function useEstConnecte(): boolean {
  const [connecte, setConnecte] = useState(false)

  useEffect(() => {
    try {
      setConnecte(Boolean(localStorage.getItem(SAR_USER_KEY)))
    } catch {
      /* stockage indisponible : on n'affiche rien de plus qu'à un visiteur */
    }
  }, [])

  return connecte
}

/**
 * Le jeton n'est plus valide côté serveur.
 *
 * Cela arrive normalement : une connexion révoque tous les jetons précédents du
 * compte, si bien qu'ouvrir une session ailleurs ferme celle-ci. Le serveur
 * répond alors « Unauthenticated », ce qui ne veut rien dire pour l'utilisateur.
 *
 * On efface donc la session locale, devenue mensongère, et on renvoie vers la
 * page de connexion en expliquant ce qui s'est passé.
 */
export function sessionExpiree(locale = "fr"): void {
  try {
    localStorage.removeItem(SAR_USER_KEY)
    localStorage.removeItem(SAR_TOKEN_KEY)
  } catch {
    /* stockage indisponible : la redirection suffit */
  }
  window.location.href = `/${locale}/login?raison=session-expiree`
}

/** Vrai si la réponse dit que la session n'est plus valide. Renvoie alors
 *  l'utilisateur vers la connexion, plutôt que de lui montrer le message brut
 *  du serveur au milieu d'un formulaire. */
export function sessionPerdue(res: Response, locale = "fr"): boolean {
  if (res.status !== 401) return false
  sessionExpiree(locale)
  return true
}

/** En-tête d'authentification des routes d'administration, tel que l'envoie
 *  déjà la page /admin. Vide si aucun jeton n'est en mémoire. */
export function entetesAdmin(): Record<string, string> {
  try {
    const jeton = localStorage.getItem(SAR_TOKEN_KEY)
    return jeton ? { Authorization: `Bearer ${jeton}` } : {}
  } catch {
    return {}
  }
}
