import type { ReactNode } from "react";
import type { SxProps, Theme } from "@mui/material/styles";
import type {
  GridColDef,
  GridFilterModel,
  GridPaginationModel,
  GridRenderCellParams,
  GridRowIdGetter,
  GridSortModel,
  GridValidRowModel,
} from "@mui/x-data-grid";

export type DataTableColDef<Row extends GridValidRowModel> = GridColDef<Row> & {
  /** Show a tooltip on the cell. `true` uses the cell value; a function returns a custom title. */
  showTooltip?:
    | boolean
    | ((params: GridRenderCellParams<Row>) => string | null | undefined);
  /** Tooltip text for the column header. */
  headerTooltip?: string;
};

export type PaginationItem = number | "...";

export type DataTableProps<Row extends GridValidRowModel> = {
  rows: Row[];
  columns: DataTableColDef<Row>[];
  getRowId?: GridRowIdGetter<Row>;
  loading?: boolean;
  error?: string | null;
  emptyMessage?: string;
  emptyContent?: ReactNode;
  /** Offset empty overlay below the column header row (px). */
  emptyOverlayInsetTop?: number;
  /** Fill the remaining height of a flex-column page and keep pagination at the bottom. */
  fillAvailableHeight?: boolean;
  height?: number | string;
  pageSize?: number;
  rowHeight?: number;
  columnHeaderHeight?: number;
  paperSx?: SxProps<Theme>;
  dataGridSx?: SxProps<Theme>;
  // When true, show the column-header "⋮" menu (sort / filter / hide / manage columns).
  enableColumnMenu?: boolean;
  // When true, show a checkbox on every row for selecting rows.
  checkboxSelection?: boolean;
  /** When true, show all rows and hide the Previous/Next pagination footer. */
  hidePagination?: boolean;
  /** Use server-driven pagination with `rowCount` and controlled `paginationModel`. */
  paginationMode?: "client" | "server";
  rowCount?: number;
  paginationModel?: GridPaginationModel;
  onPaginationModelChange?: (model: GridPaginationModel) => void;
  sortingMode?: "client" | "server";
  sortModel?: GridSortModel;
  onSortModelChange?: (model: GridSortModel) => void;
  filterMode?: "client" | "server";
  filterModel?: GridFilterModel;
  onFilterModelChange?: (model: GridFilterModel) => void;
};
