"use client";

import { LinkIcon, ListMinusIcon, ListPlusIcon, TagIcon, TagsIcon } from "lucide-react";
import { Button } from "@/components/ui/button";

// Déclencheurs des gestes du réservoir (spec Imports §1.8) — **rien que des déclencheurs**.
//
// Les dialogues eux-mêmes vivent au niveau de la table (`keywords-table.tsx`) et non dans la
// cellule qui les ouvre : une action réussie revalide la page, et une cellule de TanStack est
// remontée dès que l'identité de ses colonnes change. Un dialogue rendu dans la cellule
// disparaissait donc au moment précis où il avait quelque chose à dire — son décompte
// (« 3 ajoutés sur 5 ») était calculé puis jeté. Hors de la cellule, il survit à la
// revalidation et le résultat reste lisible.
//
// **Il n'y a plus de menu par ligne** : les gestes d'un seul mot-clé sont dans son panneau de
// détail, qu'un clic sur la ligne ouvre. Une colonne d'actions dupliquait ce panneau tout en
// coûtant une colonne à une table déjà large.

/** Ce qu'une ligne ou une sélection demande d'ouvrir. */
export type DialogKind = "attach" | "list-add" | "list-remove" | "tag-add" | "tag-remove";

export type OpenDialog = (dialog: {
  kind: DialogKind;
  keywordIds: string[];
  /** Renseigné depuis une ligne : le dialogue nomme alors le mot-clé. */
  keyword?: string;
  /** Appelé à la fermeture — la sélection de masse s'y vide. */
  onDone?: () => void;
}) => void;

/**
 * Actions de masse, au pied de la table dès qu'une case est cochée.
 *
 * La hiérarchie se lit dans les variantes : l'attache en plein (c'est le geste de
 * planification type, et la spec le liste en premier — §1.8), le rangement en contour, les
 * retraits en rouge. Chaque bouton garde son mot : une icône seule sur un geste de masse
 * portant sur cinquante lignes serait un pari.
 */
export function KeywordBulkActions({
  selectedIds,
  clearSelection,
  openDialog,
}: {
  selectedIds: string[];
  clearSelection: () => void;
  openDialog: OpenDialog;
}) {
  // La sélection est vidée à la **fermeture** du dialogue : garder cochées des lignes dont
  // les listes, les tags ou les attaches viennent de changer inviterait à réappliquer
  // l'action sans le vouloir.
  const open = (kind: DialogKind) =>
    openDialog({ kind, keywordIds: selectedIds, onDone: clearSelection });

  return (
    <>
      <Button size="sm" onClick={() => open("attach")}>
        <LinkIcon data-icon="inline-start" />
        Attacher à une page
      </Button>
      <Button variant="outline" size="sm" onClick={() => open("list-add")}>
        <ListPlusIcon data-icon="inline-start" />
        Ajouter à une liste
      </Button>
      <Button variant="outline" size="sm" onClick={() => open("tag-add")}>
        <TagIcon data-icon="inline-start" />
        Tagger
      </Button>
      <Button variant="destructive" size="sm" onClick={() => open("list-remove")}>
        <ListMinusIcon data-icon="inline-start" />
        Retirer d'une liste
      </Button>
      <Button variant="destructive" size="sm" onClick={() => open("tag-remove")}>
        <TagsIcon data-icon="inline-start" />
        Retirer un tag
      </Button>
    </>
  );
}
