import { Head, Link, router } from '@inertiajs/react';
import { Mail, MailOpen, Trash2 } from 'lucide-react';
import { useState } from 'react';
import { ConfirmDialog } from '@/components/admin/confirm-dialog';
import { DataTable, type Column } from '@/components/admin/data-table';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';

interface Message { id: number; name: string; email: string; subject: string | null; is_read: boolean; created_at: string }

interface Props {
    messages: { data: Message[]; meta: any; links: any[] };
    unreadCount: number;
    filters: { search?: string; unread?: string };
}

export default function MessagesIndex({ messages, unreadCount, filters }: Props) {
    const [selectedIds, setSelectedIds] = useState<number[]>([]);
    const [confirmBulkOpen, setConfirmBulkOpen] = useState(false);
    const [confirmDeleteId, setConfirmDeleteId] = useState<number | null>(null);

    const columns: Column<Message>[] = [
        {
            key: 'is_read', label: '', className: 'w-8',
            render: (m) => m.is_read
                ? <MailOpen className="h-4 w-4 text-muted-foreground" />
                : <Mail className="h-4 w-4 text-primary" />,
        },
        {
            key: 'name', label: 'From',
            render: (m) => (
                <div className={m.is_read ? undefined : 'font-semibold'}>
                    <p>{m.name}</p>
                    <p className="text-xs text-muted-foreground">{m.email}</p>
                </div>
            ),
        },
        { key: 'subject', label: 'Subject', render: (m) => <span className={m.is_read ? 'text-muted-foreground' : 'font-medium'}>{m.subject ?? '—'}</span> },
        { key: 'is_read', label: 'Status', render: (m) => <Badge variant={m.is_read ? 'secondary' : 'default'}>{m.is_read ? 'Read' : 'Unread'}</Badge> },
        { key: 'created_at', label: 'Received', className: 'hidden md:table-cell', render: (m) => <span className="text-sm text-muted-foreground">{new Date(m.created_at).toLocaleDateString('en-GB')}</span> },
        {
            key: 'actions', label: '', className: 'w-24 text-right',
            render: (m) => (
                <div className="flex justify-end gap-1">
                    <Button variant="ghost" size="sm" asChild><Link href={`/admin/messages/${m.id}`}>View</Link></Button>
                    <Button variant="ghost" size="icon" className="h-8 w-8 text-destructive hover:text-destructive" onClick={() => setConfirmDeleteId(m.id)}><Trash2 className="h-4 w-4" /></Button>
                </div>
            ),
        },
    ];

    return (
        <>
            <Head title="Messages" />
            <div className="space-y-6">
                <div className="flex items-center justify-between">
                    <div>
                        <h1 className="text-2xl font-bold">Contact Messages</h1>
                        <p className="mt-1 text-sm text-muted-foreground">{messages.meta.total} total · {unreadCount} unread</p>
                    </div>
                    {filters.unread ? (
                        <Button variant="outline" onClick={() => router.get('/admin/messages')}>Show all</Button>
                    ) : (
                        <Button variant="outline" onClick={() => router.get('/admin/messages', { unread: '1' })}>Unread only</Button>
                    )}
                </div>

                <DataTable data={messages.data} columns={columns} meta={messages.meta} links={messages.links} searchable searchPlaceholder="Search by email or subject..."
                    selectedIds={selectedIds} onSelectionChange={(ids) => setSelectedIds(ids as number[])}
                    bulkActions={
                        <div className="flex gap-2">
                            <Button variant="outline" size="sm" onClick={() => router.post('/admin/messages/mark-read', { ids: selectedIds }, { onSuccess: () => setSelectedIds([]) })}>
                                Mark read
                            </Button>
                            <Button variant="destructive" size="sm" onClick={() => setConfirmBulkOpen(true)}>
                                <Trash2 className="mr-2 h-4 w-4" />Delete {selectedIds.length}
                            </Button>
                        </div>
                    }
                    empty="No messages." />
            </div>

            <ConfirmDialog open={confirmBulkOpen} onOpenChange={setConfirmBulkOpen} title={`Delete ${selectedIds.length} message(s)?`} description="This is permanent." confirmLabel="Delete" variant="danger"
                onConfirm={() => router.post('/admin/messages/bulk-destroy', { ids: selectedIds }, { onSuccess: () => { setSelectedIds([]); setConfirmBulkOpen(false); } })} />
            <ConfirmDialog open={confirmDeleteId !== null} onOpenChange={(open) => !open && setConfirmDeleteId(null)} title="Delete message?" description="This is permanent." confirmLabel="Delete" variant="danger"
                onConfirm={() => confirmDeleteId !== null && router.delete(`/admin/messages/${confirmDeleteId}`, { onSuccess: () => setConfirmDeleteId(null) })} />
        </>
    );
}
