import {
  columnFilteringFeature,
  columnVisibilityFeature,
  createFilteredRowModel,
  createPaginatedRowModel,
  createSortedRowModel,
  filterFn_includesString,
  globalFilteringFeature,
  rowPaginationFeature,
  rowSelectionFeature,
  rowSortingFeature,
  sortFn_alphanumeric,
  sortFn_basic,
  sortFn_datetime,
  sortFn_text,
  tableFeatures,
} from "@tanstack/react-table";

// TanStack Table v9 : les fonctionnalités non déclarées ici sont éliminées du bundle.
// Toutes les tables de l'application partagent ce jeu (recherche, filtres, tri,
// pagination, visibilité des colonnes) pour que les définitions de colonnes d'un module
// soient typées contre les mêmes features.
export const dataTableFeatures = tableFeatures({
  columnFilteringFeature,
  columnVisibilityFeature,
  globalFilteringFeature,
  rowPaginationFeature,
  // Sélection de lignes : la base des **actions de masse** (spec Imports §1.8). Elle est
  // déclarée globalement, mais une table sans colonne de sélection ne l'active jamais —
  // c'est `bulkActions` qui la fait apparaître (`data-table.tsx`).
  rowSelectionFeature,
  rowSortingFeature,
  filteredRowModel: createFilteredRowModel(),
  paginatedRowModel: createPaginatedRowModel(),
  sortedRowModel: createSortedRowModel(),
  // Les registres bornent les valeurs acceptées par `filterFn` / `sortFn` : seuls les noms
  // déclarés existent, et la détection automatique du tri ne peut piocher que là-dedans.
  filterFns: { includesString: filterFn_includesString },
  sortFns: {
    alphanumeric: sortFn_alphanumeric,
    basic: sortFn_basic,
    datetime: sortFn_datetime,
    text: sortFn_text,
  },
});

export type DataTableFeatures = typeof dataTableFeatures;
