import React, { useRef } from 'react';
import { TableBody } from './components/tableBody';
import { TableContainer } from './components/tableContainer';
import { TableCustomHeaders } from './components/tableCustomHeaders';
import { TableEmptyState } from './components/tableEmptyState';
import { TableFooter } from './components/tableFooter';
import { TableHeader } from './components/tableHeader';
import { TableHeaderRow } from './components/tableHeaderRow';
import { TableWrapper } from './components/tableWrapper';
import { TableContextProvider } from './context';
import { defineColumnTemplate } from './tableColumnTemplates';
import { TableExtensions } from './tableExtensions';
import type { TableColumnStubProps, TableProps } from './types';

function GridTable<Data>(props: TableProps<Data>) {
    const wrapperRef = useRef<HTMLDivElement | null>(null);

    return (
        <TableContextProvider props={props} wrapperRef={wrapperRef}>
            <TableWrapper wrapperRef={wrapperRef}>
                <TableHeader />
                <TableCustomHeaders />
                <TableContainer>
                    <TableHeaderRow />
                    <TableBody />
                </TableContainer>
                <TableEmptyState />
                <TableFooter />
            </TableWrapper>
        </TableContextProvider>
    );
}

function TableColumnDefinitionStub<Data = object>(
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    props: TableColumnStubProps<Data>
) {
    return null;
}

export interface GridTableBaseNested {
    /**
     * Column definition stub.
     * Note that this element is not actually rendered, but used as a way to define columns in the table.
     */
    Column: typeof TableColumnDefinitionStub;
    /**
     * Extend the table with custom logic / ui behaviors.
     */
    addExtension: typeof TableExtensions.addExtension;
    /**
     * Add custom column definition template.
     */
    defineColumnTemplate: typeof defineColumnTemplate;
}

const GridTableBase = GridTable as GridTableBaseNested & typeof GridTable;
GridTableBase.addExtension = TableExtensions.addExtension;
GridTableBase.defineColumnTemplate = defineColumnTemplate;
GridTableBase.Column = TableColumnDefinitionStub;

export { GridTableBase as GridTable };
