import { Column } from "@tanstack/react-table";
export type SubRowsCellContext<T> = {
    getValue: () => unknown;
    row: {
        original: T;
    };
};
export interface ColumnConfig<T> {
    id: string;
    header: string;
    accessorKey?: keyof T;
    accessorFn?: (row: T) => string | number | boolean | Date | React.ReactNode;
    cell?: (ctx: SubRowsCellContext<T>) => React.ReactNode;
    enableSorting?: boolean;
    enableColumnFilter?: boolean;
    filterType?: "text" | "select" | "date" | "number";
    filterOptions?: FilterOption[];
    enableGlobalFilter?: boolean;
    enableEditing?: boolean;
    editType?: "text" | "select" | "date" | "number";
    editOptions?: FilterOption[];
    onCellEdit?: (value: string | number | boolean | Date, rowData: T) => Promise<void> | void;
    size?: number;
    skeleton?: {
        width?: string;
        height?: string;
    };
    serverFilterKey?: string;
    serverSortKey?: string;
}
export interface ServerSideConfig<T> {
    enabled: boolean;
    onDataRequest: (params: ServerSideParams, identifier?: boolean) => Promise<ServerSideResponse<T>>;
    totalCount?: number;
    loading?: boolean;
    debounceMs?: number;
}
export interface ServerSideParams {
    page: number;
    limit: number;
    sortBy?: string;
    sortOrder?: "asc" | "desc";
    [key: string]: string | number | undefined;
    dateField?: string;
    dateRange?: string;
    startDate?: string;
    endDate?: string;
}
export interface ServerSideResponse<T> {
    success: boolean;
    message: string;
    data: T[];
    meta: {
        total: number;
        page: number;
        limit: number;
        totalPages: number;
    };
}
export interface FilterOption {
    label: string;
    value: string | number;
}
export interface ColumnFilterProps<T> {
    column: Column<T, any>;
    filterType?: string;
    filterOptions?: FilterOption[];
    theme: TableTheme;
    serverSide?: boolean;
    debounceMs?: number;
    onServerFilterChange?: (columnId: string, value: any) => void;
}
export interface ViewState {
    id: string;
    name: string;
    columnVisibility: Record<string, boolean>;
    pageSize: number;
    isDefault?: boolean;
}
export interface EnhancedDataTableProps<T> {
    data?: T[];
    columns: ColumnConfig<T>[];
    loading?: boolean;
    skeletonRows?: number;
    emptyMessage?: string;
    onRowClick?: (item: T) => void;
    selectedRowId?: number;
    enableGlobalSearch?: boolean;
    enableColumnVisibility?: boolean;
    enablePagination?: boolean;
    enableCSVExport?: boolean;
    enableDateRangeFilter?: boolean;
    dateFilterField?: string;
    enableCustomDateRangeFilter?: boolean;
    globalSearchPlaceholder?: string;
    initialPageSize?: number;
    pageSizeOptions?: number[];
    enableCustomViews?: boolean;
    viewStorageKey?: string;
    onViewChange?: (view: ViewState) => void;
    hasSubRows?: boolean;
    getSubRows?: (item: T) => any[];
    subRowsColumns?: ColumnConfig<any>[];
    expandedItems?: Set<number>;
    onToggleExpand?: (id: number) => void;
    getRowId?: (row: T) => number | string;
    theme?: "light" | "dark" | TableTheme;
    customTheme?: Partial<TableTheme>;
    serverSide?: ServerSideConfig<T>;
}
export interface ServerSideState {
    currentPage: number;
    pageSize: number;
    filters: Record<string, any>;
    sorting: {
        field: string | null;
        direction: "asc" | "desc" | null;
    };
    dateRange: {
        field: string | null;
        range: string;
        startDate: string | null;
        endDate: string | null;
    };
}
export interface TableTheme {
    tableShadow?: string;
    headerBg?: string;
    headerText?: string;
    rowEvenBg?: string;
    rowOdd?: string;
    rowHover?: string;
    rowText?: string;
    subRowEvenBg?: string;
    subRowOddBg?: string;
    subRowHover?: string;
    subRowText?: string;
    buttonPrimaryBg?: string;
    buttonPrimaryText?: string;
    buttonPrimaryBorder?: string;
    buttonPrimaryHover?: string;
    buttonSecondaryBg?: string;
    buttonSecondaryText?: string;
    buttonSecondaryBorder?: string;
    buttonSecondaryHover?: string;
}
export declare const tableThemes: {
    light: TableTheme;
    dark: TableTheme;
};
