import type { ColumnDef } from '@tanstack/react-table';
import { Link } from '@inertiajs/react';
import { SortableColumnHeader } from '@/components/ui/sortable-column-header';
import type { TranslateFn } from '@/features/users/lib/permission-i18n';
import { UserStatusBadge } from '@/features/users/components/user-status-badge';
import { UserRowActions } from '@/features/users/table/user-row-actions';
import type { ManagedUser } from '@/features/users/types';
import { formatDate } from '@/lib/datetime';

type SortHandler = (column: 'name' | 'email' | 'created_at' | 'is_active') => void;
type ToggleStatusHandler = (user: ManagedUser) => void;

export function getUsersColumns(
    onSort: SortHandler,
    onToggleStatus: ToggleStatusHandler,
    t: TranslateFn,
    appLocale: string,
): ColumnDef<ManagedUser>[] {
    return [
        {
            accessorKey: 'name',
            header: () => (
                <SortableColumnHeader label={t('users.admin_index.table.column_name')} onSort={() => onSort('name')} />
            ),
            cell: ({ row }) => (
                <Link
                    href={`/admin/users/${row.original.id}/edit`}
                    className="block max-w-[20rem] cursor-pointer truncate font-semibold text-primary hover:opacity-80"
                >
                    {row.original.name}
                </Link>
            ),
        },
        {
            accessorKey: 'email',
            header: () => (
                <SortableColumnHeader
                    label={t('users.admin_index.table.column_email')}
                    onSort={() => onSort('email')}
                />
            ),
        },
        {
            accessorKey: 'roles',
            header: t('users.admin_index.table.column_roles'),
            cell: ({ row }) => {
                const roles = row.original.roles;

                if (roles.length === 0) {
                    return <span className="text-muted-foreground">{t('users.admin_index.table.no_roles')}</span>;
                }

                return roles.join(', ');
            },
        },
        {
            accessorKey: 'direct_permissions',
            header: t('users.admin_index.table.column_direct_permissions'),
            cell: ({ row }) => {
                const permissions = row.original.direct_permissions;

                if (permissions.length === 0) {
                    return (
                        <span className="text-muted-foreground">{t('users.admin_index.table.no_direct_permissions')}</span>
                    );
                }

                return t('users.admin_index.table.direct_permissions_count', { count: permissions.length });
            },
        },
        {
            accessorKey: 'is_active',
            header: () => (
                <SortableColumnHeader
                    label={t('users.admin_index.table.column_status')}
                    onSort={() => onSort('is_active')}
                />
            ),
            cell: ({ row }) => <UserStatusBadge isActive={row.original.is_active} />,
        },
        {
            accessorKey: 'created_at',
            header: () => (
                <SortableColumnHeader
                    label={t('users.admin_index.table.column_created_at')}
                    onSort={() => onSort('created_at')}
                />
            ),
            cell: ({ row }) => formatDate(row.original.created_at, appLocale),
        },
        {
            id: 'actions',
            header: () => (
                <span className="block text-end text-[11px] font-semibold leading-tight text-foreground/85">
                    {t('users.admin_index.table.column_actions')}
                </span>
            ),
            cell: ({ row }) => (
                <UserRowActions
                    editHref={`/admin/users/${row.original.id}/edit`}
                    isActive={row.original.is_active}
                    onToggleStatus={() => onToggleStatus(row.original)}
                />
            ),
        },
    ];
}
