import { describe, expect, it } from "vitest";
import { pageKey, visibleSelection } from "./table-selection";

// Le bug que ces deux fonctions rendent impossible (review T5, Important n°1) : cocher dix
// mots-clés sur la cible FR, changer de cible dans l'en-tête — le composant client reste
// monté, sa sélection survit — puis « Ajouter à une liste » verse dix mots-clés français
// dans une liste anglaise. La même mécanique, en plus discret, sur « page suivante » et sur
// n'importe quel filtre.

describe("pageKey", () => {
  it("est stable pour la même page", () => {
    expect(pageKey("fr", ["a", "b"])).toBe(pageKey("fr", ["a", "b"]));
  });

  it("change quand la portée change, à lignes identiques", () => {
    // Le cas de la review : deux cibles peuvent partager des mots-clés (mutualisation à
    // l'organisation, décision n°2), la portée doit donc entrer dans la clé.
    expect(pageKey("fr", ["a", "b"])).not.toBe(pageKey("en", ["a", "b"]));
  });

  it("change quand les lignes changent, à portée identique", () => {
    expect(pageKey("fr", ["a", "b"])).not.toBe(pageKey("fr", ["c", "d"]));
    expect(pageKey("fr", ["a", "b"])).not.toBe(pageKey("fr", ["a"]));
  });

  it("ne confond pas deux découpages qui se recollent", () => {
    // Sans séparateur sûr, ["a|b"] et ["a", "b"] auraient la même clé.
    expect(pageKey("s", ["a|b"])).not.toBe(pageKey("s", ["a", "b"]));
  });

  it("distingue une portée vide d'une portée absente de la clé", () => {
    expect(pageKey("", ["a"])).not.toBe(pageKey("a", []));
  });
});

describe("visibleSelection", () => {
  it("ne rend que les lignes réellement affichées", () => {
    // Filet de sécurité : même si la sélection n'avait pas été vidée, une action de masse
    // ne peut pas porter sur une ligne absente de l'écran.
    expect(visibleSelection({ a: true, disparu: true }, ["a", "b"])).toEqual(["a"]);
  });

  it("rend une liste vide quand la page a entièrement changé", () => {
    expect(visibleSelection({ fr1: true, fr2: true }, ["en1", "en2"])).toEqual([]);
  });

  it("ignore les entrées décochées", () => {
    expect(visibleSelection({ a: true, b: false }, ["a", "b"])).toEqual(["a"]);
  });

  it("suit l'ordre de la page, pas celui de la sélection", () => {
    expect(visibleSelection({ b: true, a: true }, ["a", "b"])).toEqual(["a", "b"]);
  });

  it("supporte une page vide", () => {
    expect(visibleSelection({ a: true }, [])).toEqual([]);
  });
});
