import type { LucideIcon } from "lucide-react";
import { BadgeCheckIcon, ClockIcon, LayersIcon, Unlink2Icon } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { ATTACH_STATUS_LABELS, ATTACH_STATUS_VARIANTS } from "@/lib/keywords";
import { cn } from "@/lib/utils";

// Badge d'attache — le seul rendu du statut, partagé par la table, les cartes et le panneau
// de détail. Le libellé et la variante de base viennent du vocabulaire partagé
// (`lib/keywords.ts`) : un statut ajouté côté api s'affiche brut plutôt que de disparaître,
// et cet écran n'ajoute que la teinte.
//
// **Le mot reste toujours.** L'icône et la teinte sont des raccourcis de lecture, jamais la
// seule information : un statut qui ne se lirait qu'à sa couleur serait inaccessible.
//
// Les teintes sont les jetons de statut du thème — voile plus encre, jamais l'aplat plein.
// « En attente de crawl » est le seul état d'attente de cet écran, et donc le seul ambre :
// la difficulté, elle, se lit à une longueur de barre.
//
// `multi` (attaché à plusieurs pages) n'est pas un avertissement — l'ambre lui est interdit.
// Il prend donc le jeton du statut fait, et c'est l'icône qui dit la pluralité.
const TONES: Record<string, string> = {
  attached: "bg-status-ok-surface text-status-ok",
  multi: "bg-status-ok-surface text-status-ok",
  // Le pointillé double la teinte plutôt que de la remplacer : l'attente se distingue aussi
  // en niveaux de gris, et à l'impression.
  pending: "bg-status-pending-surface text-status-pending border-current/25 border-dashed",
  orphan: "bg-status-idle-surface text-status-idle",
};

const ICONS: Record<string, LucideIcon> = {
  attached: BadgeCheckIcon,
  pending: ClockIcon,
  multi: LayersIcon,
  orphan: Unlink2Icon,
};

export function AttachBadge({ status, className }: { status: string; className?: string }) {
  const Icon = ICONS[status];
  return (
    <Badge
      variant={ATTACH_STATUS_VARIANTS[status] ?? "outline"}
      className={cn("font-normal", TONES[status], className)}
    >
      {Icon ? <Icon data-icon="inline-start" /> : null}
      {ATTACH_STATUS_LABELS[status] ?? status}
    </Badge>
  );
}
