import type { ColumnDef } from '@tanstack/react-table';
import { DataTableColumnHeader } from '@/components/data-table/data-table-column-header';

const NON_SORTABLE_COLUMN_IDS = new Set(['actions', 'manage_booking']);

function getColumnTitle<TData, TValue>(
    column: ColumnDef<TData, TValue>,
): string {
    if (column.meta?.label) {
        return column.meta.label;
    }

    if (typeof column.header === 'string') {
        return column.header;
    }

    if ('accessorKey' in column && column.accessorKey) {
        return String(column.accessorKey);
    }

    if (column.id) {
        return column.id;
    }

    return 'Column';
}

function isSortableColumn<TData, TValue>(
    column: ColumnDef<TData, TValue>,
): boolean {
    const columnId =
        column.id ??
        ('accessorKey' in column ? String(column.accessorKey) : undefined);

    if (columnId && NON_SORTABLE_COLUMN_IDS.has(columnId)) {
        return false;
    }

    if (column.enableSorting === false) {
        return false;
    }

    return true;
}

export function enhanceDataTableColumns<TData, TValue>(
    columns: ColumnDef<TData, TValue>[],
    options: { sortable?: boolean } = {},
): ColumnDef<TData, TValue>[] {
    const { sortable = true } = options;

    return columns.map((column): ColumnDef<TData, TValue> => {
        if (!sortable || !isSortableColumn(column)) {
            return {
                ...column,
                enableSorting: false,
                enableColumnFilter: false,
            } as ColumnDef<TData, TValue>;
        }

        const title = getColumnTitle(column);

        return {
            ...column,
            enableSorting: column.enableSorting ?? true,
            enableColumnFilter: false,
            header: ({ column: tableColumn }) => (
                <DataTableColumnHeader
                    column={tableColumn}
                    title={title}
                    className={column.meta?.headerClassName}
                />
            ),
        } as ColumnDef<TData, TValue>;
    });
}
