import {
    MantineReactTable,
    MRT_ColumnDef,
    MRT_RowData,
    MRT_TableInstance,
    MRT_TableOptions,
    useMantineReactTable
} from "mantine-react-table";
import {MRT_Localization_RU} from "mantine-react-table/locales/ru/index.cjs";
import {forwardRef, useEffect, useImperativeHandle} from 'react';

type Props<T extends Record<string, unknown>, K extends keyof T> = {
    data: T[],
    onSelectionChange?: (selectedRows: T[]) => void,
    columns: MRT_ColumnDef<T, K>[],
    restProps?: MRT_TableOptions<T>,
    striped?: boolean
}


// Экспортируем тип рефа, чтобы он мог быть использован в других компонентах
export type BaseTableRef<T extends MRT_RowData> = {
    getTable: () => MRT_TableInstance<T>;
};

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
export const BaseTable = forwardRef<BaseTableRef<never>, Props<never>>((props, ref) => {
    const {data, columns, restProps, striped = true, onSelectionChange} = props;

    const table = useMantineReactTable({
        localization: MRT_Localization_RU,
        enablePagination: false,
        data,
        columns,
        mantineTableProps: {
            striped: striped
        },
        enableTopToolbar: false,
        enableBottomToolbar: false,
        enableRowSelection: onSelectionChange !== undefined,
        ...restProps,
    });
    useEffect(() => {
        if (!onSelectionChange) return;
        onSelectionChange(table.getSelectedRowModel().rows.map(row => row.original))
    }, [table.getState().rowSelection]);

    // Используем useImperativeHandle для определения, что будет доступно через ref
    useImperativeHandle(ref, () => ({
        // @ts-ignore
        getTable: () => table
    }));


    return <MantineReactTable table={table}/>;
});