import AdminLayout from '@/layouts/admin/layout';
import { Head, router } from '@inertiajs/react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Table, TableBody, TableHead, TableHeader, TableRow } from '@/components/ui/table';
import { CalendarDays, Plus } from 'lucide-react';
import {
    AlertDialog,
    AlertDialogAction,
    AlertDialogCancel,
    AlertDialogContent,
    AlertDialogDescription,
    AlertDialogFooter,
    AlertDialogHeader,
    AlertDialogTitle,
} from '@/components/ui/alert-dialog';
import { useState } from 'react';
import { EventPageProps, EventData } from './types';
import { useEventForm } from './hooks/useEventForm';
import { EventFormDialog } from './components/EventFormDialog';
import { EventTableRow } from './components/EventTableRow';
import { EventEmptyState } from './components/EventEmptyState';
import { EventPagination } from './components/EventPagination';

export default function AdminEventPage({ events, currentRegistrationCount: _currentRegistrationCount, masks }: EventPageProps) {
    const [showCreateDialog, setShowCreateDialog] = useState(false);
    const [showEditDialog, setShowEditDialog] = useState(false);
    const [showDeleteDialog, setShowDeleteDialog] = useState(false);
    const [selectedEvent, setSelectedEvent] = useState<EventData | null>(null);

    const { form: createForm, resetForm: resetCreateForm } = useEventForm();
    const { form: editForm, setEventData } = useEventForm();

    const formatNumber = (num: number): string => {
        return new Intl.NumberFormat('id-ID').format(num);
    };

    const handleCreate = (e: React.FormEvent) => {
        e.preventDefault();
        createForm.post('/admin/event', {
            onSuccess: () => {
                setShowCreateDialog(false);
                resetCreateForm();
            },
        });
    };

    const handleEdit = (event: EventData) => {
        setSelectedEvent(event);
        setEventData(event);
        setShowEditDialog(true);
    };

    const handleUpdate = (e: React.FormEvent) => {
        e.preventDefault();
        if (!selectedEvent) return;
        editForm.put(`/admin/event/${selectedEvent.id}`, {
            onSuccess: () => {
                setShowEditDialog(false);
                setSelectedEvent(null);
            },
        });
    };

    const handleDelete = (event: EventData) => {
        setSelectedEvent(event);
        setShowDeleteDialog(true);
    };

    const confirmDelete = () => {
        if (!selectedEvent) return;
        router.delete(`/admin/event/${selectedEvent.id}`, {
            onSuccess: () => {
                setShowDeleteDialog(false);
                setSelectedEvent(null);
            },
        });
    };

    const handleToggle = (event: EventData) => {
        router.post(`/admin/event/${event.id}/toggle`);
    };

    const handlePageChange = (page: number) => {
        if (page < 1 || page > events.last_page) return;
        router.get('/admin/event', { page }, { preserveState: true });
    };

    return (
        <AdminLayout>
            <Head title="Event Management" />

            <div className="space-y-6">
                {/* Header */}
                <div className="flex flex-col gap-4 md:flex-row md:items-center md:justify-between">
                    <div>
                        <h2 className="text-2xl font-bold tracking-tight flex items-center gap-2">
                            <CalendarDays className="w-6 h-6 text-primary" />
                            Event Management
                        </h2>
                        <p className="text-muted-foreground">
                            Manage registration milestone events and rewards
                        </p>
                    </div>
                    <Button onClick={() => setShowCreateDialog(true)}>
                        <Plus className="w-4 h-4 mr-2" />
                        Create Event
                    </Button>
                </div>

                {/* Events Table */}
                <Card>
                    <CardHeader>
                        <CardTitle>All Events</CardTitle>
                        <CardDescription>
                            Showing {events.from} - {events.to} of {events.total} events
                        </CardDescription>
                    </CardHeader>
                    <CardContent>
                        <div className="rounded-md border overflow-x-auto">
                            <Table>
                                <TableHeader>
                                    <TableRow>
                                        <TableHead>Name</TableHead>
                                        <TableHead>Milestone</TableHead>
                                        <TableHead>Progress</TableHead>
                                        <TableHead>Reward</TableHead>
                                        <TableHead>Claims</TableHead>
                                        <TableHead>Status</TableHead>
                                        <TableHead className="text-right">Actions</TableHead>
                                    </TableRow>
                                </TableHeader>
                                <TableBody>
                                    {events.data.length > 0 ? (
                                        events.data.map((event) => (
                                            <EventTableRow
                                                key={event.id}
                                                event={event}
                                                onEdit={handleEdit}
                                                onDelete={handleDelete}
                                                onToggle={handleToggle}
                                                formatNumber={formatNumber}
                                            />
                                        ))
                                    ) : (
                                        <EventEmptyState />
                                    )}
                                </TableBody>
                            </Table>
                        </div>

                        {/* Pagination */}
                        <EventPagination pagination={events} onPageChange={handlePageChange} />
                    </CardContent>
                </Card>
            </div>

            {/* Create Event Dialog */}
            <EventFormDialog
                open={showCreateDialog}
                onOpenChange={setShowCreateDialog}
                mode="create"
                form={createForm}
                onSubmit={handleCreate}
                masks={masks}
            />

            {/* Edit Event Dialog */}
            <EventFormDialog
                open={showEditDialog}
                onOpenChange={setShowEditDialog}
                mode="edit"
                form={editForm}
                onSubmit={handleUpdate}
                masks={masks}
            />

            {/* Delete Confirmation Dialog */}
            <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>
                <AlertDialogContent>
                    <AlertDialogHeader>
                        <AlertDialogTitle>Delete Event</AlertDialogTitle>
                        <AlertDialogDescription>
                            Are you sure you want to delete &quot;{selectedEvent?.name}&quot;? This action cannot be undone.
                        </AlertDialogDescription>
                    </AlertDialogHeader>
                    <AlertDialogFooter>
                        <AlertDialogCancel>Cancel</AlertDialogCancel>
                        <AlertDialogAction onClick={confirmDelete} className="bg-destructive text-destructive-foreground">
                            Delete
                        </AlertDialogAction>
                    </AlertDialogFooter>
                </AlertDialogContent>
            </AlertDialog>
        </AdminLayout>
    );
}
