"use client"

import { useEffect, useState } from "react"
import { Check } from "lucide-react"

/**
 * La confirmation d'envoi, commune à tous les formulaires du portail.
 *
 * Les quatre formulaires du site (contact, candidature spontanée, candidature
 * à une offre, demande d'agrément) écrivaient chacun leur propre message de
 * réussite. Le dessin y était voisin mais jamais identique : la pastille
 * passait de 40 à 56 px, le titre de `text-sm` à `text-lg`, la phrase
 * d'explication manquait ici, le bouton de reprise là. Un même geste du
 * visiteur ne doit pas produire quatre écrans différents.
 *
 * Le gabarit retenu est celui de la candidature spontanée : pastille rouge de
 * 48 px, coche blanche, titre court, filet rouge, puis la phrase qui dit ce
 * qui va se passer, et le bouton de reprise quand une nouvelle saisie a un
 * sens.
 */
export function ConfirmationEnvoi({
  titre,
  texte,
  actionLabel,
  onAction,
  encadre = false,
}: {
  titre: string
  texte?: string
  actionLabel?: string
  onAction?: () => void
  /** À passer quand aucune carte n'entoure déjà la confirmation. */
  encadre?: boolean
}) {
  return (
    <div
      className={`py-10 text-center ${encadre ? "border border-neutral-200 bg-white px-6" : ""}`}
      role="status"
      aria-live="polite"
    >
      <div className="mx-auto mb-4 flex h-12 w-12 items-center justify-center bg-primary text-white">
        <Check className="h-6 w-6" strokeWidth={2.5} aria-hidden />
      </div>
      <h3 className="text-base font-bold text-gray-900">{titre}</h3>
      <div className="mx-auto my-3 h-0.5 w-10 rounded-full bg-primary/70" aria-hidden />
      {texte && (
        <p className="mx-auto max-w-md text-sm leading-relaxed text-gray-600">{texte}</p>
      )}
      {actionLabel && onAction && (
        <button
          type="button"
          onClick={onAction}
          className="mt-5 inline-flex items-center gap-1.5 border border-neutral-300 px-4 py-2 text-xs font-semibold uppercase tracking-widest text-gray-600 transition-colors hover:border-primary hover:text-primary"
        >
          {actionLabel}
        </button>
      )}
    </div>
  )
}

/**
 * Le bandeau flottant qui accuse réception en haut de l'écran.
 *
 * Il était posé à `top-16`, soit 64 px : la barre de navigation en mesure de
 * 56 à 160 px selon la largeur de l'écran et selon que son premier étage est
 * replié ou non, le bandeau passait donc derrière elle. Plutôt qu'une valeur
 * fixe de plus, il se place sous la barre réellement affichée, mesurée à
 * l'ouverture puis à chaque redimensionnement.
 */
export function BandeauEnvoi({ message }: { message: string | null }) {
  const [haut, setHaut] = useState(96)

  useEffect(() => {
    if (!message) return

    const mesurer = () => {
      const barre = document.getElementById("navbar-principal")
      setHaut((barre?.getBoundingClientRect().height ?? 80) + 16)
    }

    mesurer()
    // La barre se replie au défilement : le bandeau la suit tant qu'il vit.
    window.addEventListener("resize", mesurer)
    window.addEventListener("scroll", mesurer, { passive: true })
    return () => {
      window.removeEventListener("resize", mesurer)
      window.removeEventListener("scroll", mesurer)
    }
  }, [message])

  if (!message) return null

  return (
    <div
      className="fixed left-1/2 z-40 -translate-x-1/2 px-4 transition-[top] duration-300"
      style={{ top: haut }}
      role="status"
      aria-live="polite"
    >
      {/* Aplat rouge et texte blanc, comme les étiquettes du site. */}
      <div className="flex items-center gap-2 bg-primary px-5 py-2.5 text-sm text-white shadow-lg">
        <Check className="h-4 w-4 flex-shrink-0" strokeWidth={2.5} aria-hidden />
        {message}
      </div>
    </div>
  )
}
