import { RowData, AccessorKeyColumnDef, ColumnSort, Cell, Table } from '@tanstack/react-table';
import { SortOrder } from './constants.js';
import { StylesConfig } from 'react-select';
import { PaginationProps } from '../pagination/pagination.js';
import 'react/jsx-runtime';

declare module '@tanstack/react-table' {
    interface TableMeta<TData extends RowData> {
        updateData: (rowIndex: string, columnId: string, value: unknown) => void;
    }
}
type EditableTableColumnDef<TData> = Omit<AccessorKeyColumnDef<TData, any>, 'meta'> & {
    meta?: ColumnMeta<TData>;
    accessorKey: keyof TData | '';
};
type EditableTableProps<TData, IdType> = {
    tableId?: string;
    tableName: string;
    data: TData[];
    columns: EditableTableColumnDef<TData>[];
    isLoading: boolean;
    handleSaveData: (data: SaveData<TData, IdType>) => void;
    idSelector: (data: TData) => IdType;
    tableHeight?: string;
    checkBoxSelectedName: string;
    selectAllCheckBoxName?: string;
    tableInstanceRef?: any;
    setColumnFilters?: (value: any) => void;
    hiddenColumnIds?: string[];
    isCellDisabled?: (data: TData, column: EditableTableColumnDef<TData>['id']) => boolean;
    serverPagination?: boolean;
    totalCount?: number;
    currentPage?: number;
    onPageChange?: (page: number) => void;
    currentPageSize?: number;
    onPageSizeChange?: (limit: number) => void;
    defaultSortingHeaders?: ColumnSort[];
    handleSort?: (sortData: {
        columnId: string;
        order: SortOrder;
    }) => void;
    globalFilter?: string;
    setGlobalFilter?: (value: any) => void;
    paginationSizeOptions?: PaginationProps['sizeOptions'];
};
type EditableTableCellProps<TData, IdType> = {
    cell: Cell<TData, unknown>;
    rowHeaderId?: string;
    checkBoxSelectedName?: string;
    isCellDisabled?: EditableTableProps<TData, IdType>['isCellDisabled'];
};
interface SaveData<TData, IdType> {
    rowId: IdType;
    columnId: string;
    accessorKey: keyof TData | '';
    value: string | number | boolean;
}
type ColumnMeta<TData> = CheckBoxMetaData<TData> | LinkMetaData | MultiSelectMetaData | TextInputMetaData | SelectMetaData | SwitchMetaData<TData>;
interface CheckBoxMetaData<TData> {
    type: 'checkbox';
    label?: (data: TData) => string;
}
interface LinkMetaData {
    type: 'link';
}
interface MultiSelectMetaData {
    type: 'multiselect';
    placeholder: string;
    label: string;
    options: {
        label: string;
        value: string | number;
    }[];
    customStyles: StylesConfig<MultiSelectMetaData['options'][0], true>;
}
interface TextInputMetaData {
    type: 'text' | 'date' | 'number';
    placeholder: string;
    label: string;
    step?: number;
}
interface SelectMetaData {
    type: 'select';
    placeholder: string;
    label: string;
    options: {
        label: string;
        value: string;
    }[];
}
interface SwitchMetaData<TData> {
    type: 'switch';
    label?: (data: TData) => string;
    activeText?: string;
    inactiveText?: string;
}
interface Row<TData> {
    getValue(columnId: string): unknown;
    original: TData;
}
interface FocusData {
    rowIndex: number;
    columnIndex: number;
    isHeader: boolean;
}
interface FocusHandlerContextType {
    tableRef: React.RefObject<HTMLTableElement>;
    focusedCell: FocusData;
    setFocusedCell: (focusData: FocusData) => void;
}
interface TableContextType<TData, IdType> {
    handleSaveData: EditableTableProps<TData, IdType>['handleSaveData'];
    idSelector: EditableTableProps<TData, IdType>['idSelector'];
    table: Table<TData>;
}

export { CheckBoxMetaData, ColumnMeta, EditableTableCellProps, EditableTableColumnDef, EditableTableProps, FocusData, FocusHandlerContextType, LinkMetaData, MultiSelectMetaData, Row, SaveData, SelectMetaData, SwitchMetaData, TableContextType, TextInputMetaData };
