import { Head, router } from '@inertiajs/react';
import { Trash2 } from 'lucide-react';
import { useState } from 'react';
import { toast } from 'sonner';

import DashboardLayout from '@/components/dashboard/DashboardLayout';
import { DashboardPageHeader } from '@/components/dashboard/DashboardPageHeader';
import BulkActionBar from '@/components/dashboard/BulkActionBar';
import ConfirmDialog from '@/components/dashboard/ConfirmDialog';
import DataTable, { Column, Paginator } from '@/components/dashboard/DataTable';
import { Button } from '@/components/ui/button';
import {
    TableActionMenu,
    TableActionMenuContent,
    TableActionMenuItem,
    TableActionMenuLabel,
    TableActionMenuTrigger,
} from '@/components/ui/table-action-menu';
import { useTranslation } from '@/contexts/LanguageContext';
import { useAppDate } from '@/lib/date';
import { formatNumber } from '@/lib/format';

interface FavoriteRow {
    id: number;
    created_at: string;
    user: { id: number; username: string } | null;
    game: { id: number; title: string; slug: string } | null;
}

interface Props {
    rows: Paginator<FavoriteRow>;
    filters: { search: string; user_id: string | null; game_id: string | null };
}

export default function FavoritesIndex({ rows, filters }: Props) {
    const { t } = useTranslation();
    const { formatDateTime } = useAppDate();
    const [selected, setSelected] = useState<number[]>([]);
    const [deleteTarget, setDeleteTarget] = useState<FavoriteRow | null>(null);

    function bulkDelete() {
        if (selected.length === 0) return;
        const count = selected.length;
        router.post(
            '/dashboard/favorites/bulk',
            { action: 'delete', ids: selected },
            {
                preserveScroll: true,
                onSuccess: () => {
                    setSelected([]);
                    toast.success(`${count} favorite${count === 1 ? '' : 's'} deleted`);
                },
                onError: (errors) => toast.error((Object.values(errors)[0] as string) || t('Failed')),
            },
        );
    }

    const columns: Column<FavoriteRow>[] = [
        {
            key: 'user',
            label: t('User'),
            cell: (row) =>
                row.user ? (
                    <a href={`/profile/${row.user.username}`} target="_blank" rel="noreferrer" className="font-medium text-primary underline-offset-2 hover:underline">{row.user.username}</a>
                ) : (
                    <span className="text-muted-foreground">—</span>
                ),
        },
        {
            key: 'game',
            label: t('Game'),
            cell: (row) =>
                row.game ? (
                    <a
                        href={`/play/${row.game.slug}`}
                        target="_blank"
                        rel="noreferrer"
                        className="text-primary underline-offset-2 hover:underline"
                    >
                        {row.game.title}
                    </a>
                ) : (
                    <span className="text-muted-foreground">—</span>
                ),
        },
        {
            key: 'created_at',
            label: t('Date'),
            cell: (row) => (
                <span className="text-sm text-muted-foreground">
                    {formatDateTime(row.created_at)}
                </span>
            ),
        },
    ];

    return (
        <DashboardLayout>
            <Head title={t('Favorites')} />
            <DashboardPageHeader
                title={t('Favorites')}
                subtitle={`${formatNumber(rows.total)} ${rows.total === 1 ? t('favorite') : t('favorites')} — ${t('Every {user, game} pair from the favorites table. Delete spam links here without affecting other user data.')}`}
            />

            <DataTable
                rows={rows}
                columns={columns}
                searchPlaceholder="Search by user or game…"
                initialSearch={filters.search}
                selection={{ selected, onSelectionChange: setSelected }}
                rowActions={(row) => (
                    <div className="flex justify-end">
                        <TableActionMenu>
                            <TableActionMenuTrigger />
                            <TableActionMenuContent>
                                <TableActionMenuLabel>{t('Actions')}</TableActionMenuLabel>
                                <TableActionMenuItem
                                    variant="destructive"
                                    onClick={() => setDeleteTarget(row)}
                                >
                                    <Trash2 className="h-4 w-4" />
                                    Delete
                                </TableActionMenuItem>
                            </TableActionMenuContent>
                        </TableActionMenu>
                    </div>
                )}
            />

            <BulkActionBar selectedCount={selected.length} onClear={() => setSelected([])}>
                <Button size="sm" variant="destructive" onClick={bulkDelete}>
                    Delete selected
                </Button>
            </BulkActionBar>

            <ConfirmDialog
                open={deleteTarget !== null}
                onOpenChange={(open) => !open && setDeleteTarget(null)}
                title={t('Delete this favorite?')}
                description={t('This cannot be undone.')}
                confirmLabel={t('Delete')}
                onConfirm={() => {
                    if (!deleteTarget) return;
                    router.delete(`/dashboard/favorites/${deleteTarget.id}`, {
                        preserveScroll: true,
                        onSuccess: () => toast.success(t('Favorite deleted')),
                        onError: (errors) =>
                            toast.error((Object.values(errors)[0] as string) || t('Delete failed')),
                    });
                }}
            />
        </DashboardLayout>
    );
}
