import { BoxProps } from '@mui/material';
import { ReactNode } from 'react';

export type GenericFilterValueType = string | number | boolean | null;
export type GenericFilterType = {
    filterKey: string;
    value: GenericFilterValueType;
};
export type FilterType = {
    value: string;
    filterKey: string;
};
export type GenericOptionsType = {
    value: string | number | boolean;
    label: string;
} | string[];
export interface SelectHeaderCellProps {
    isRowSelect?: boolean;
}
export interface UnfilteredHeaderCellProps<TableDataType = Record<string, unknown>, FooterDataType = Record<string, unknown>> {
    isRowSelect?: boolean;
    header: ReactNode;
    headerToolTip?: string;
    sortKey?: string;
    renderCell: string | ((item: TableDataType, cIdx: number, rIdx: number) => ReactNode);
    renderFooterCell?: string | ((footerData: FooterDataType, idx: number) => ReactNode);
}
export interface FilteredTableHeaderCellProps<TableDataType = Record<string, unknown>, FooterDataType = Record<string, unknown>, OptType extends GenericOptionsType = GenericOptionsType> extends UnfilteredHeaderCellProps<TableDataType, FooterDataType> {
    additionalFilterKeys?: string[];
    filterKey?: string;
    filterOptions?: OptType[];
    getFilterValue?: ((item: OptType) => string) | string | undefined;
    getIcon?: (item: OptType) => ReactNode;
    getItemLabel?: ((item: OptType) => string) | string | undefined;
    isFilterLocked?: boolean;
    renderFilterKey?: (key: string, value: unknown) => string;
    selectedFilters?: string[];
    style?: BoxProps['sx'];
}
export type TableColumnType<TableDataType = Record<string, unknown>, OptType extends GenericOptionsType = GenericOptionsType, FooterDataType = Record<string, unknown>> = FilteredTableHeaderCellProps<TableDataType, FooterDataType, OptType>;
export type TableProps<TableDataType = Record<string, unknown>, OptType extends GenericOptionsType = GenericOptionsType, FooterDataType = Record<string, unknown>> = {
    loading?: boolean;
    data: TableDataType[];
    columns: TableColumnType<TableDataType, OptType, FooterDataType>[];
    selectedRows?: (string | number)[];
    loadingRows?: number;
    headerBackground?: string;
    footerBackground?: BoxProps['bgcolor'];
    noResultsLabel?: string;
    clearFilersOnNoResultLabel?: string;
    disableSelection?: boolean;
    disableNoResults?: boolean;
    disableTableHeader?: boolean;
    disableClearFiltersOnNoResults?: boolean;
    filters?: FilterType[];
    footerData?: Record<string, unknown>;
    getTrLeftBorderColor?: string | ((item: TableDataType, idx: number) => string);
    getTrProps?: (item: Record<string, unknown>, idx: number) => Record<string, unknown>;
    getSelectedRow?: string | ((item: TableDataType, idx: number) => string);
    onUnselectAllFilters?: () => void;
    onReorder?: (itemFrom: unknown, itemTo: unknown) => void;
    onSelectRow?: (item: TableDataType, idx: number) => void;
    onSelectAllFilters?: () => void;
    onSetFilters?: (allValues: {
        value: string;
        filterKey: string;
    }[]) => void;
    reorderRowId?: string;
    sx?: BoxProps['sx'];
    rootInjection?: ReactNode;
    disableSelectAll?: boolean;
};
