// src/components/keywords/enrich-status-logic.test.ts — réduction provider-
// agnostique de l'enrichissement multi-sources à l'affichage (spinner / erreur /
// rien). `deriveDisplay` est importé du module de logique PURE : la cellule
// importe lucide (cjs `react.createContext`), non chargeable sous
// `--conditions=react-server` — l'isoler garde le test exécutable.
import { describe, expect, test } from "bun:test";
import type { KeywordEnrichment } from "@/lib/keywords/types";
import { deriveDisplay } from "./enrich-status-logic";

const at = "2026-07-25T00:00:00.000Z";

describe("deriveDisplay", () => {
  test("absent / vide → none", () => {
    expect(deriveDisplay(undefined)).toEqual({ kind: "none" });
    expect(deriveDisplay({})).toEqual({ kind: "none" });
  });

  test("done seul → none (rien à afficher)", () => {
    expect(deriveDisplay({ mangools: { status: "done", at } })).toEqual({
      kind: "none",
    });
  });

  test("queued|syncing → active (le spinner prime)", () => {
    expect(deriveDisplay({ mangools: { status: "queued", at } })).toEqual({
      kind: "active",
    });
    expect(deriveDisplay({ seranking: { status: "syncing", at } })).toEqual({
      kind: "active",
    });
  });

  test("un en vol prime sur une erreur d'une autre source", () => {
    const enrichment: KeywordEnrichment = {
      seranking: { status: "error", at, error: "quota" },
      mangools: { status: "syncing", at },
    };
    expect(deriveDisplay(enrichment)).toEqual({ kind: "active" });
  });

  test("erreur → liste par source avec message FR mappé", () => {
    const enrichment: KeywordEnrichment = {
      mangools: { status: "error", at, error: "token" },
      seranking: { status: "error", at, error: "no_location" },
    };
    const display = deriveDisplay(enrichment);
    expect(display.kind).toBe("error");
    if (display.kind !== "error") throw new Error("unreachable");
    expect(display.errors).toEqual([
      { source: "mangools", label: "token invalide" },
      { source: "seranking", label: "pays non couvert" },
    ]);
  });

  test("code d'erreur inconnu → label générique « échec »", () => {
    const display = deriveDisplay({
      mangools: { status: "error", at, error: "weird" },
    });
    if (display.kind !== "error") throw new Error("unreachable");
    expect(display.errors[0]).toEqual({ source: "mangools", label: "échec" });
  });
});
