/**
 * Helpers de formatage de date pour les chaînes renvoyées par l'API PHP.
 *
 * L'API renvoie soit :
 *   - DATETIME MySQL : "2026-05-28 17:39:58" (UTC implicite, pas de Z)
 *   - ISO 8601 : "2026-05-28T17:39:58Z" (ex: /api/health)
 *   - DATE seule : "2026-05-28"
 *
 * On normalise vers un format Date JS valide en supposant UTC quand pas de zone.
 */

function toDate(input: string): Date | null {
  // DATE seule (YYYY-MM-DD) : on évite l'interprétation UTC qui décalerait
  // au jour précédent dans les fuseaux ouest. Construit en local 12:00 pour stabilité.
  if (/^\d{4}-\d{2}-\d{2}$/.test(input)) {
    const [y, m, d] = input.split('-').map(Number)
    return new Date(y, m - 1, d, 12, 0, 0)
  }
  // Sinon traite la chaîne comme datetime UTC.
  const normalized = input.replace(' ', 'T').replace(/\.\d+/, '')
  const withZone = /[Zz]$|[+-]\d{2}:?\d{2}$/.test(normalized) ? normalized : normalized + 'Z'
  const d = new Date(withZone)
  return isNaN(d.getTime()) ? null : d
}

/** "28 mai 2026" — pas d'heure. */
export function formatDate(input: string | null | undefined): string {
  if (!input) return ''
  const d = toDate(input)
  if (!d) return input
  return d.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' })
}

/** "28 mai 2026, 19:45" — avec heure (locale utilisateur). */
export function formatDateTime(input: string | null | undefined): string {
  if (!input) return ''
  const d = toDate(input)
  if (!d) return input
  return d.toLocaleString('fr-FR', {
    day: 'numeric', month: 'short', year: 'numeric',
    hour: '2-digit', minute: '2-digit',
  })
}

/** "il y a 5 min" / "il y a 2 h" / "il y a 3 j" / date courte au-delà. */
export function formatRelative(input: string | null | undefined): string {
  if (!input) return ''
  const d = toDate(input)
  if (!d) return input
  const diffSec = (Date.now() - d.getTime()) / 1000
  if (diffSec < 60) return "à l'instant"
  if (diffSec < 3600) return `il y a ${Math.floor(diffSec / 60)} min`
  if (diffSec < 86400) return `il y a ${Math.floor(diffSec / 3600)} h`
  if (diffSec < 604800) return `il y a ${Math.floor(diffSec / 86400)} j`
  return d.toLocaleDateString('fr-FR', { day: 'numeric', month: 'short', year: 'numeric' })
}

/** "septembre 2020" — mois + année (pour "Créé en…"). */
export function formatMonthYear(input: string | null | undefined): string {
  if (!input) return ''
  const d = toDate(input)
  if (!d) return input
  return d.toLocaleDateString('fr-FR', { month: 'long', year: 'numeric' })
}
