import { router } from '@inertiajs/react';
import type { ColumnDef } from '@tanstack/react-table';
import { useMemo, useState } from 'react';
import { IconButton } from '@/components/common/IconButton';
import { Badge } from '@/components/ui/badge';
import { tableRowIconButtonClass } from '@/lib/icon-button-classes';
import { SortableColumnHeader } from '@/components/ui/sortable-column-header';
import type { VatRateListItem, VatRatesSortColumn } from '@/features/vat-rates/types';
import { useI18n } from '@/hooks/use-i18n';

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

function formatRate(value: number, numberLocale: string): string {
    return `${new Intl.NumberFormat(numberLocale, { minimumFractionDigits: 0, maximumFractionDigits: 2 }).format(value)}%`;
}

function VatRateRowActions({
    row,
    canManage,
    onEdit,
}: {
    row: VatRateListItem;
    canManage: boolean;
    onEdit: (id: number) => void;
}) {
    const { t } = useI18n();
    const [busy, setBusy] = useState(false);

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

    if (!canManage) {
        return null;
    }

    return (
        <div className="flex justify-end gap-1">
            <IconButton
                type="button"
                variant="text"
                color="ghost"
                size="sm"
                className={tableRowIconButtonClass}
                aria-label={t('settings.vat_rates.row_actions.edit')}
                disabled={busy}
                onClick={() => onEdit(row.id)}
                icon="solar:pen-bold-duotone"
            />
            {row.is_active ? (
                <IconButton
                    type="button"
                    variant="text"
                    color="secondary"
                    size="sm"
                    className={tableRowIconButtonClass}
                    aria-label={t('settings.vat_rates.row_actions.deactivate')}
                    disabled={busy}
                    onClick={() => patch(`/settings/vat-rates/${row.id}/deactivate`)}
                    icon="solar:forbidden-circle-bold-duotone"
                />
            ) : (
                <IconButton
                    type="button"
                    variant="text"
                    color="secondary"
                    size="sm"
                    className={tableRowIconButtonClass}
                    aria-label={t('settings.vat_rates.row_actions.reactivate')}
                    disabled={busy}
                    onClick={() => patch(`/settings/vat-rates/${row.id}/reactivate`)}
                    icon="solar:refresh-square-bold-duotone"
                />
            )}
        </div>
    );
}

function buildVatRatesColumns(
    t: (key: string, replacements?: Record<string, string | number>) => string,
    numberLocale: string,
    onSort: SortHandler,
    canManage: boolean,
    onEdit: (id: number) => void,
): ColumnDef<VatRateListItem>[] {
    return [
        {
            accessorKey: 'sort_order',
            header: () => (
                <SortableColumnHeader
                    label={t('settings.vat_rates.table.columns.sort_order')}
                    onSort={() => onSort('sort_order')}
                />
            ),
            cell: ({ row }) => <span className="font-mono text-sm tabular-nums">{row.original.sort_order}</span>,
        },
        {
            accessorKey: 'code',
            header: () => (
                <SortableColumnHeader label={t('settings.vat_rates.table.columns.code')} onSort={() => onSort('code')} />
            ),
            cell: ({ row }) => <span className="font-mono text-xs font-medium">{row.original.code}</span>,
        },
        {
            accessorKey: 'name',
            header: () => (
                <SortableColumnHeader label={t('settings.vat_rates.table.columns.name')} onSort={() => onSort('name')} />
            ),
            cell: ({ row }) => (
                <span className="max-w-xs truncate font-medium" title={row.original.name}>
                    {row.original.name}
                </span>
            ),
        },
        {
            accessorKey: 'rate_percent',
            header: () => (
                <SortableColumnHeader
                    label={t('settings.vat_rates.table.columns.rate_percent')}
                    onSort={() => onSort('rate_percent')}
                />
            ),
            cell: ({ row }) => <span className="tabular-nums">{formatRate(row.original.rate_percent, numberLocale)}</span>,
        },
        {
            accessorKey: 'is_active',
            header: () => (
                <SortableColumnHeader
                    label={t('settings.vat_rates.table.columns.status')}
                    onSort={() => onSort('is_active')}
                />
            ),
            cell: ({ row }) =>
                row.original.is_active ? (
                    <Badge variant="successSoft" className="font-normal">
                        {t('settings.vat_rates.table.status_active')}
                    </Badge>
                ) : (
                    <Badge variant="secondary" className="font-normal">
                        {t('settings.vat_rates.table.status_inactive')}
                    </Badge>
                ),
        },
        {
            id: 'actions',
            header: () => (
                <span className="block text-end text-[11px] font-semibold leading-tight text-foreground/85">
                    {t('settings.vat_rates.table.columns.actions')}
                </span>
            ),
            cell: ({ row }) => <VatRateRowActions row={row.original} canManage={canManage} onEdit={onEdit} />,
        },
    ];
}

export function useVatRatesColumns(onSort: SortHandler, canManage: boolean, onEdit: (id: number) => void) {
    const { t, locale } = useI18n();
    const numberLocale =
        locale === 'ro' ? 'ro-RO' : locale === 'bg' ? 'bg-BG' : 'en-US';

    return useMemo(
        () => buildVatRatesColumns(t, numberLocale, onSort, canManage, onEdit),
        [t, numberLocale, onSort, canManage, onEdit],
    );
}
