import Link from "next/link";
import { createColumnHelper } from "@tanstack/react-table";
import type { DataTableFeatures } from "@/components/data-table/features";
import { Badge } from "@/components/ui/badge";

// Ligne prête à afficher de l'onglet Imports : imports **et** événements de rattachement
// (§1.2), entrelacés par l'api. Les libellés et les dates localisées sont calculés côté
// serveur — `toLocaleDateString` divergerait entre le rendu serveur et l'hydratation.
export type ImportRow = {
  id: string;
  /** `import` ou `map_reconcile` : le listing est fusionné, la colonne le dit. */
  kind: string;
  kindLabel: string;
  sourceLabel: string;
  filename: string;
  targetLabel: string;
  /** ISO : tri chronologique par comparaison lexicographique. */
  fetchedAt: string;
  fetchedAtLabel: string;
  status: string;
  statusLabel: string;
  summary: string;
  /** Page de détail, absente pour un événement de rattachement (il n'en a pas). */
  href: string | null;
};

const STATUS_VARIANTS: Record<string, "secondary" | "outline" | "destructive"> = {
  queued: "outline",
  running: "outline",
  done: "secondary",
  failed: "destructive",
};

const helper = createColumnHelper<DataTableFeatures, ImportRow>();

export const importColumns = helper.columns([
  helper.accessor("sourceLabel", {
    header: "Source",
    enableHiding: false,
    cell: ({ row }) =>
      row.original.href ? (
        <Link href={row.original.href} className="font-medium underline underline-offset-4">
          {row.original.sourceLabel}
        </Link>
      ) : (
        <span className="font-medium">{row.original.sourceLabel}</span>
      ),
  }),
  helper.accessor("kindLabel", { header: "Type", filterFn: "includesString" }),
  //  « Nom » et non « Fichier » : cette colonne porte le nom du fichier pour un import CSV et
  //  celui de la liste KWFinder pour un import API — c'est l'étiquette d'affichage de la ligne,
  //  et depuis les imports de listes elle ne désigne plus toujours un fichier.
  helper.accessor("filename", { header: "Nom" }),
  helper.accessor("targetLabel", { header: "Cible", filterFn: "includesString" }),
  helper.accessor("fetchedAt", {
    header: "Date des données",
    enableGlobalFilter: false,
    cell: ({ row }) => row.original.fetchedAtLabel,
  }),
  // L'accesseur porte le **libellé français**, pas la valeur brute de l'api : c'est lui qui
  // est affiché, donc c'est lui que la recherche globale et le filtre doivent voir. Sur
  // `status`, chercher « Terminé » ne trouvait rien (la colonne valait `done`).
  helper.accessor("statusLabel", {
    header: "Statut",
    filterFn: "includesString",
    cell: ({ row }) => (
      <Badge variant={STATUS_VARIANTS[row.original.status] ?? "outline"}>
        {row.original.statusLabel}
      </Badge>
    ),
  }),
  helper.accessor("summary", {
    header: "Rapport",
    enableSorting: false,
    //  Sur une ligne en échec, cette colonne porte le **motif** (`imports.error`), pas un
    //  décompte : le gris de rapport le faisait lire comme un résumé anodin. La couleur ne
    //  porte pas l'information à elle seule — le badge de statut dit déjà « Échec ».
    cell: ({ row }) => (
      <span
        className={row.original.status === "failed" ? "text-destructive" : "text-muted-foreground"}
      >
        {row.original.summary}
      </span>
    ),
  }),
]);
