import { Head, router } from '@inertiajs/react';
import { ExternalLink, Pencil, 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 ConfirmDialog from '@/components/dashboard/ConfirmDialog';
import DataTable, { Column, Paginator } from '@/components/dashboard/DataTable';
import FormDialog from '@/components/dashboard/FormDialog';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    TableActionMenu,
    TableActionMenuContent,
    TableActionMenuItem,
    TableActionMenuLabel,
    TableActionMenuSeparator,
    TableActionMenuTrigger,
} from '@/components/ui/table-action-menu';
import { useTranslation } from '@/contexts/LanguageContext';
import { useAppDate } from '@/lib/date';
import { formatNumber } from '@/lib/format';

import Form from './Form';

interface PageRow {
    id: number;
    title: string;
    slug: string;
    content: string | null;
    is_published: boolean;
    updated_at: string;
}

interface Props {
    rows: Paginator<PageRow>;
    filters: { search: string };
}

export default function PagesIndex({ rows, filters }: Props) {
    const { t } = useTranslation();
    const { formatDateTime } = useAppDate();
    const [createOpen, setCreateOpen] = useState(false);
    const [editTarget, setEditTarget] = useState<PageRow | null>(null);
    const [deleteTarget, setDeleteTarget] = useState<PageRow | null>(null);

    const columns: Column<PageRow>[] = [
        {
            key: 'title',
            label: t('Title'),
            cell: (row) => <span className="font-medium">{row.title}</span>,
        },
        {
            key: 'slug',
            label: t('Slug'),
            cell: (row) => (
                <code className="rounded bg-muted px-2 py-1 font-mono text-xs">{row.slug}</code>
            ),
        },
        {
            key: 'is_published',
            label: t('Status'),
            cell: (row) => (
                <Badge variant={row.is_published ? 'default' : 'secondary'}>
                    {row.is_published ? t('Published') : t('Draft')}
                </Badge>
            ),
        },
        {
            key: 'updated_at',
            label: t('Updated'),
            cell: (row) => (
                <span className="text-sm text-muted-foreground">
                    {formatDateTime(row.updated_at)}
                </span>
            ),
        },
    ];

    function handleDelete() {
        if (!deleteTarget) return;
        const title = deleteTarget.title;
        router.delete(`/dashboard/pages/${deleteTarget.id}`, {
            preserveScroll: true,
            onSuccess: () => {
                toast.success(t(':title deleted', { title }));
                setDeleteTarget(null);
            },
            onError: (errors) => {
                toast.error((Object.values(errors)[0] as string) || t('Delete failed'));
                setDeleteTarget(null);
            },
        });
    }

    return (
        <DashboardLayout>
            <Head title={t('Pages')} />
            <DashboardPageHeader
                title={t('Pages')}
                subtitle={`${formatNumber(rows.total)} ${rows.total === 1 ? t('static page') : t('static pages')} — ${t('About, Privacy, Terms, etc. Each page is reachable at /page/{slug} on the public site.')}`}
                action={<Button onClick={() => setCreateOpen(true)}>{t('New page')}</Button>}
            />

            <DataTable
                rows={rows}
                columns={columns}
                searchPlaceholder={t('Search by title or slug…')}
                initialSearch={filters.search}
                rowActions={(row) => (
                    <div className="flex justify-end">
                        <TableActionMenu>
                            <TableActionMenuTrigger />
                            <TableActionMenuContent>
                                <TableActionMenuLabel>{t('Actions')}</TableActionMenuLabel>
                                <TableActionMenuItem
                                    onClick={() => window.open(`/page/${row.slug}`, '_blank')}
                                >
                                    <ExternalLink className="h-4 w-4" />
                                    {t('Open public page')}
                                </TableActionMenuItem>
                                <TableActionMenuItem onClick={() => setEditTarget(row)}>
                                    <Pencil className="h-4 w-4" />
                                    {t('Edit')}
                                </TableActionMenuItem>
                                <TableActionMenuSeparator />
                                <TableActionMenuItem
                                    variant="destructive"
                                    onClick={() => setDeleteTarget(row)}
                                >
                                    <Trash2 className="h-4 w-4" />
                                    {t('Delete')}
                                </TableActionMenuItem>
                            </TableActionMenuContent>
                        </TableActionMenu>
                    </div>
                )}
            />

            <FormDialog open={createOpen} onOpenChange={setCreateOpen} title={t('New page')} size="lg">
                <Form
                    mode="create"
                    onSuccess={() => {
                        setCreateOpen(false);
                        toast.success(t('Page created'));
                    }}
                />
            </FormDialog>

            <FormDialog
                open={editTarget !== null}
                onOpenChange={(open) => !open && setEditTarget(null)}
                title={t('Edit page')}
                size="lg"
            >
                {editTarget && (
                    <Form
                        mode="update"
                        initialData={editTarget}
                        onSuccess={() => {
                            setEditTarget(null);
                            toast.success(t('Page updated'));
                        }}
                    />
                )}
            </FormDialog>

            <ConfirmDialog
                open={deleteTarget !== null}
                onOpenChange={(open) => !open && setDeleteTarget(null)}
                title={t('Delete ":title"?', { title: deleteTarget?.title ?? '' })}
                description={t('This cannot be undone.')}
                confirmLabel={t('Delete')}
                onConfirm={handleDelete}
            />
        </DashboardLayout>
    );
}
