import { createRowInstance } from './base/api/rows';
import { TableCell } from './base/components/tableCell';
import { TableRow } from './base/components/tableRow';
import { useTableContext } from './base/context';
import { GridTable as GridTableNested } from './base/table';
import { TableExtensions } from './base/tableExtensions';
import { TableActionButton } from './components/tableActionButton';
import { TableActionsExtension } from './extensions/tableActions';
import { TableBulkActionsExtension } from './extensions/tableBulkActions';
import { TableClearFiltersExtension } from './extensions/tableClearFilters';
import { TableColumnSpanExtension } from './extensions/tableColumnSpan';
import { TableCustomizeExtension } from './extensions/tableCustomize';
import { TableExpandedRowsExtension } from './extensions/tableExpandedRows';
import { TableExportExtension } from './extensions/tableExport';
import { TableGroupedRowsExtension } from './extensions/tableGroupedRows';
import { TablePaginationExtension } from './extensions/tablePagination';
import { TablePaginationTextExtension } from './extensions/tablePaginationText';
import { TablePinnedRowsExtension } from './extensions/tablePinnedRows';
import { TableSelectedCountExtension } from './extensions/tableSelectedCount';
import { TableSelectionExtension } from './extensions/tableSelection';
import { TableShowMoreExtension } from './extensions/tableShowMore';
import { TableSourceExtension } from './extensions/tableSource';
import { TableTotalsRowExtension } from './extensions/tableTotalsRow';
import { TableUpdateIndicatorExtension } from './extensions/tableUpdateIndicator';
import { TableZebraVariantExtension } from './extensions/tableZebraVariant';
import type { GridTableBaseNested } from './base/table';
import './extensions/tableActions/types';
import './extensions/tableExpandedRows/types';
import './extensions/tableShowMore/types';
import './extensions/tableGroupedRows/types';
import './extensions/tableColumnSpan/types';
import './extensions/tableSelection/types';
import './extensions/tablePagination/types';
import './extensions/tablePaginationText/types';
import './extensions/tableCustomize';
import './extensions/tableUpdateIndicator';
import './extensions/tableExport';
import './extensions/tableClearFilters';
import './extensions/tableSource';
import './extensions/tableBulkActions';
import './extensions/tablePinnedRows';
import './extensions/tableTotalsRow';

export type {
    ColumnDefinition as GridTableColumnDefinition,
    ColumnTemplate as GridTableColumnTemplate,
    ColumnTemplates as GridTableColumnTemplates,
    TableProps as GridTableProps,
    RowInstance as GridTableRowInstance,
    SortBy as GridTableSortBy,
    CellProps as GridTableCellProps,
    GridTableCustomColumn,
} from './base/types';

export type { SelectAll as GridTableSelectAll } from './extensions/tableSelection/types';

export type { TableRowActionProps as GridTableRowActionProps } from './extensions/tableActions/types';

TableExtensions.addExtension(
    // Rows
    TableActionsExtension,
    TableExpandedRowsExtension,
    TableSelectionExtension,
    TablePinnedRowsExtension,
    TableTotalsRowExtension,
    TableColumnSpanExtension,
    /* GroupedRows must be added after other extension that create columns,
     * e.g. actions and selection */
    TableGroupedRowsExtension,

    // Footer
    TableShowMoreExtension,

    // Left/Right extensions should be placed here "in reverse order" than their priority of appearance in the UI
    // Upper = Right
    // Lower = Left

    // LeftHeader
    TableClearFiltersExtension,
    TablePaginationExtension,
    TablePaginationTextExtension,
    TableBulkActionsExtension,
    TableSelectedCountExtension, // Last: Always showing at the very left

    // RightHeader
    TableSourceExtension, // First: Always showing at the very right
    TableCustomizeExtension,
    TableExportExtension,
    TableUpdateIndicatorExtension,

    // Container
    TableZebraVariantExtension
);

export interface GridTableNested extends GridTableBaseNested {
    /**
     * Styled button for table actions.
     */
    ActionButton: typeof TableActionButton;
    /**
     * Creates a row instance used by table cell components.
     */
    createRowInstance: typeof createRowInstance;

    /**
     * Table row component.
     */
    Row: typeof TableRow;

    /**
     * Table cell component.
     */
    Cell: typeof TableCell;
}

/**
 * A table is an arrangement of information or data, typically in rows and columns. GridTable come with a set of actions allowing users to manipulate the data presented in the table.
 *
 * @type organism
 * @status revised
 * @tags tables-lists
 *
 * @nested Column, ActionButton
 */
const GridTable = GridTableNested as GridTableNested & typeof GridTableNested;
GridTable.ActionButton = TableActionButton;
GridTable.Cell = TableCell;
GridTable.Row = TableRow;
GridTable.createRowInstance = createRowInstance;

export { GridTable, useTableContext };
