import { assertEmptyObject } from '../../../utils/assertEmptyObject';
import type { TableProps } from '../Table';

import { TableFastActiveItemContextProvider } from './TableFastActiveItemContex';
import { TableHeaderCellsMetaContextProvider } from './TableHeaderCellsMetaContext';
import { TableHorizontalScrollContextProvider } from './TableHorizontalScrollContext';
import { TablePropsContextProvider } from './TablePropsContext';
import { TableSelectionContextProvider } from './TableSelectionContext';
import { TableVariablesContextProvider } from './TableVariablesContext';

/** Combination of all context that used by {@link Table} */
export function TableContexts<C extends string, D extends object>(
  props: Omit<TableProps<C, D>, 'className' | 'testId' | 'ariaDescribedBy'>,
) {
  const {
    children,
    selection,
    onSelectionChanged,
    onSortChanged,
    sort,
    totalRows,
    rowIdProvider,
    rowSelectionEnabled,
    rowSelectionIncludeLimit,
    rowSelectionName,
    stickyColumns,
    rowActionsEnabled,
    rows,
    loading,
    columns,
    ...rest
  } = props;
  assertEmptyObject(rest);

  return (
    <TablePropsContextProvider
      columns={columns}
      loading={loading}
      onSelectionChanged={onSelectionChanged}
      onSortChanged={onSortChanged}
      rowActionsEnabled={rowActionsEnabled}
      rowIdProvider={rowIdProvider}
      rows={rows}
      rowSelectionEnabled={rowSelectionEnabled}
      rowSelectionIncludeLimit={rowSelectionIncludeLimit}
      rowSelectionName={rowSelectionName}
      selection={selection}
      sort={sort}
      stickyColumns={stickyColumns}
      totalRows={totalRows}
    >
      <TableVariablesContextProvider>
        <TableSelectionContextProvider>
          <TableFastActiveItemContextProvider>
            <TableHeaderCellsMetaContextProvider>
              <TableHorizontalScrollContextProvider>{children}</TableHorizontalScrollContextProvider>
            </TableHeaderCellsMetaContextProvider>
          </TableFastActiveItemContextProvider>
        </TableSelectionContextProvider>
      </TableVariablesContextProvider>
    </TablePropsContextProvider>
  );
}
