import { Link, router } from '@inertiajs/react';
import type { ColumnDef } from '@tanstack/react-table';
import { useMemo, useState } from 'react';
import { IconButton } from '@/components/common/IconButton';
import { SagaExportModal } from '@/components/saga-export-modal';
import { Badge } from '@/components/ui/badge';
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { Icon } from '@/components/ui/icon';
import { SortableColumnHeader } from '@/components/ui/sortable-column-header';
import type { ClientListItem } from '@/features/clients/types';
import { useI18n } from '@/hooks/use-i18n';
import { tableRowIconButtonMenuClass } from '@/lib/icon-button-classes';

export type ClientsSortColumn =
    | 'name'
    | 'cif'
    | 'city'
    | 'county'
    | 'is_vat_payer'
    | 'is_individual'
    | 'active';

type SortHandler = (column: ClientsSortColumn) => void;

function emptyCell(value: string | null | undefined, fallback: string): string {
    return value && value.trim() !== '' ? value : fallback;
}

function ClientRowActions({
    row,
    canEdit,
    canAssignPortalUsers,
    onEdit,
    onManagePortalUsers,
}: {
    row: ClientListItem;
    canEdit: boolean;
    canAssignPortalUsers: boolean;
    onEdit: (id: number) => void;
    onManagePortalUsers: (id: number) => void;
}) {
    const { t } = useI18n();
    const [busy, setBusy] = useState(false);
    const [sagaExportOpen, setSagaExportOpen] = useState(false);

    const patch = (path: string) => {
        setBusy(true);
        router.patch(path, {}, { preserveScroll: true, onFinish: () => setBusy(false) });
    };

    const refreshEfacturaToken = () => {
        setBusy(true);
        router.post(
            `/admin/clients/${row.id}/efactura/refresh-token`,
            {},
            { preserveScroll: true, onFinish: () => setBusy(false) },
        );
    };

    return (
        <>
            <div className="flex justify-end">
                <DropdownMenu>
                    <DropdownMenuTrigger asChild>
                        <IconButton
                            type="button"
                            variant="text"
                            color="ghost"
                            size="sm"
                            className={tableRowIconButtonMenuClass}
                            aria-label={t('clients.admin_index.row_actions.more')}
                            disabled={busy}
                            icon="solar:menu-dots-bold-duotone"
                        />
                    </DropdownMenuTrigger>
                    <DropdownMenuContent align="end" className="w-56">
                        {canAssignPortalUsers ? (
                            <DropdownMenuItem
                                disabled={busy}
                                onClick={() => onManagePortalUsers(row.id)}
                            >
                                <Icon icon="solar:users-group-rounded-bold-duotone" className="mr-2 h-4 w-4" />
                                {t('clients.admin_index.row_actions.manage_portal')}
                            </DropdownMenuItem>
                        ) : null}
                        {row.efactura_token_needs_refresh ? (
                            <DropdownMenuItem disabled={busy} onClick={refreshEfacturaToken}>
                                <Icon icon="solar:refresh-bold-duotone" className="mr-2 h-4 w-4" />
                                {t('clients.show.efactura.row_action_refresh')}
                            </DropdownMenuItem>
                        ) : null}
                        {row.efactura_auth_url && !row.efactura_has_anaf_token ? (
                            <DropdownMenuItem asChild>
                                <a
                                    href={row.efactura_auth_url}
                                    target="_blank"
                                    rel="noopener noreferrer"
                                >
                                    <Icon icon="solar:bill-check-bold-duotone" className="mr-2 h-4 w-4" />
                                    {t('clients.show.efactura.row_action')}
                                </a>
                            </DropdownMenuItem>
                        ) : null}
                        <DropdownMenuItem disabled={busy} onClick={() => setSagaExportOpen(true)}>
                            <Icon icon="solar:export-bold-duotone" className="mr-2 h-4 w-4" />
                            {t('clients.admin_index.row_actions.export_saga')}
                        </DropdownMenuItem>
                        {canEdit ? (
                            <DropdownMenuItem disabled={busy} onClick={() => onEdit(row.id)}>
                                <Icon icon="solar:pen-bold-duotone" className="mr-2 h-4 w-4" />
                                {t('clients.admin_index.row_actions.edit')}
                            </DropdownMenuItem>
                        ) : null}
                        {canEdit ? (
                            <>
                                <DropdownMenuSeparator />
                                {row.active ? (
                                    <DropdownMenuItem
                                        variant="destructive"
                                        disabled={busy}
                                        onClick={() => patch(`/admin/clients/${row.id}/deactivate`)}
                                    >
                                        <Icon icon="solar:forbidden-circle-bold-duotone" className="mr-2 h-4 w-4" />
                                        {t('clients.admin_index.row_actions.deactivate')}
                                    </DropdownMenuItem>
                                ) : (
                                    <DropdownMenuItem
                                        disabled={busy}
                                        onClick={() => patch(`/admin/clients/${row.id}/reactivate`)}
                                        className="text-success focus:bg-success/12 focus:text-success dark:focus:bg-success/20 [&_svg]:!text-success"
                                    >
                                        <Icon icon="solar:refresh-square-bold-duotone" className="mr-2 h-4 w-4" />
                                        {t('clients.admin_index.row_actions.reactivate')}
                                    </DropdownMenuItem>
                                )}
                            </>
                        ) : null}
                    </DropdownMenuContent>
                </DropdownMenu>
            </div>

            <SagaExportModal clientId={row.id} open={sagaExportOpen} onOpenChange={setSagaExportOpen} />
        </>
    );
}

function buildClientsColumns(
    t: (key: string, replacements?: Record<string, string | number>) => string,
    onSort: SortHandler,
    canEdit: boolean,
    canAssignPortalUsers: boolean,
    onEdit: (id: number) => void,
    onManagePortalUsers: (id: number) => void,
): ColumnDef<ClientListItem>[] {
    const dash = t('clients.admin_index.columns.empty_cell');

    return [
        {
            accessorKey: 'name',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.name')} onSort={() => onSort('name')} />
            ),
            cell: ({ row }) => (
                <Link
                    href={`/admin/clients/${row.original.id}`}
                    className="block w-full min-w-0 max-w-xs cursor-pointer truncate text-left font-semibold text-primary hover:opacity-80"
                    title={row.original.name}
                >
                    {row.original.name}
                </Link>
            ),
        },
        {
            accessorKey: 'cif',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.cif')} onSort={() => onSort('cif')} />
            ),
            cell: ({ row }) => (
                <span className="font-mono text-xs">{emptyCell(row.original.cif, dash)}</span>
            ),
        },
        {
            accessorKey: 'is_individual',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.type')} onSort={() => onSort('is_individual')} />
            ),
            cell: ({ row }) =>
                row.original.is_individual ? (
                    <Badge variant="outline" className="font-normal">
                        {t('clients.admin_index.columns.type_individual')}
                    </Badge>
                ) : (
                    <Badge variant="secondary" className="font-normal">
                        {t('clients.admin_index.columns.type_company')}
                    </Badge>
                ),
        },
        {
            accessorKey: 'email',
            header: () => t('clients.admin_index.columns.email'),
            cell: ({ row }) => (
                <span className="max-w-[12rem] truncate text-sm">{emptyCell(row.original.email, dash)}</span>
            ),
        },
        {
            accessorKey: 'phone',
            header: () => t('clients.admin_index.columns.phone'),
            cell: ({ row }) => <span className="text-sm">{emptyCell(row.original.phone, dash)}</span>,
        },
        {
            accessorKey: 'city',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.city')} onSort={() => onSort('city')} />
            ),
            cell: ({ row }) => <span className="text-sm">{emptyCell(row.original.city, dash)}</span>,
        },
        {
            accessorKey: 'county',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.county')} onSort={() => onSort('county')} />
            ),
            cell: ({ row }) => <span className="text-sm">{emptyCell(row.original.county, dash)}</span>,
        },
        {
            accessorKey: 'is_vat_payer',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.vat')} onSort={() => onSort('is_vat_payer')} />
            ),
            cell: ({ row }) =>
                row.original.is_vat_payer ? (
                    <Badge variant="outline" className="font-normal">
                        {t('clients.admin_index.columns.vat_payer')}
                    </Badge>
                ) : (
                    <span className="text-muted-foreground text-sm">{t('clients.admin_index.columns.vat_non_payer')}</span>
                ),
        },
        {
            accessorKey: 'active',
            header: () => (
                <SortableColumnHeader label={t('clients.admin_index.columns.status')} onSort={() => onSort('active')} />
            ),
            cell: ({ row }) =>
                row.original.active ? (
                    <Badge variant="successSoft" className="font-normal">
                        {t('clients.admin_index.columns.status_active')}
                    </Badge>
                ) : (
                    <Badge variant="secondary" className="font-normal">
                        {t('clients.admin_index.columns.status_inactive')}
                    </Badge>
                ),
        },
        {
            id: 'actions',
            header: () => (
                <span className="block text-end text-[11px] font-semibold leading-tight text-foreground/85">
                    {t('clients.admin_index.columns.actions')}
                </span>
            ),
            cell: ({ row }) => (
                <ClientRowActions
                    row={row.original}
                    canEdit={canEdit}
                    canAssignPortalUsers={canAssignPortalUsers}
                    onEdit={onEdit}
                    onManagePortalUsers={onManagePortalUsers}
                />
            ),
        },
    ];
}

export function useClientsColumns(
    onSort: SortHandler,
    canEdit: boolean,
    canAssignPortalUsers: boolean,
    onEdit: (id: number) => void,
    onManagePortalUsers: (id: number) => void,
) {
    const { t } = useI18n();

    return useMemo(
        () => buildClientsColumns(t, onSort, canEdit, canAssignPortalUsers, onEdit, onManagePortalUsers),
        [t, onSort, canEdit, canAssignPortalUsers, onEdit, onManagePortalUsers],
    );
}
