import { useState, ReactNode } from 'react';
import { Head } from '@inertiajs/react';
import { useQuery } from '@tanstack/react-query';
import AdminLayout from '@/layouts/AdminLayout';
import { Input } from '@/components/ui/input';
import { Badge } from '@/components/ui/badge';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { Button } from '@/components/ui/button';
import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/components/ui/sheet';
import { Mail, Search, Download, AlertTriangle, Loader2, CheckCircle2 } from 'lucide-react';
import { format } from 'date-fns';
import { exportToCSV } from '@/lib/csv-export';

type EmailLog = {
  id: string;
  to_address: string;
  recipients: { to?: string[]; cc?: string[]; bcc?: string[] } | null;
  from_address: string | null;
  subject: string | null;
  body_html: string | null;
  body_text: string | null;
  status: 'sending' | 'sent' | 'failed';
  error: string | null;
  sent_at: string | null;
  created_at: string;
  updated_at: string;
};

const statusBadge = (status: string) => {
  if (status === 'sent') return <Badge className="bg-green-100 text-green-700 border-green-200 hover:bg-green-100"><CheckCircle2 className="w-3 h-3 mr-1" />Sent</Badge>;
  if (status === 'failed') return <Badge className="bg-red-100 text-red-700 border-red-200 hover:bg-red-100"><AlertTriangle className="w-3 h-3 mr-1" />Failed</Badge>;
  return <Badge className="bg-amber-100 text-amber-700 border-amber-200 hover:bg-amber-100"><Loader2 className="w-3 h-3 mr-1 animate-spin" />Sending</Badge>;
};

const EmailLogsPage = () => {
  const [search, setSearch] = useState('');
  const [statusFilter, setStatusFilter] = useState('all');
  const [selected, setSelected] = useState<EmailLog | null>(null);

  const { data: logs, isLoading } = useQuery({
    queryKey: ['email-logs', statusFilter, search],
    queryFn: async () => {
      const params = new URLSearchParams();
      if (statusFilter !== 'all') params.set('status', statusFilter);
      if (search.trim()) params.set('q', search.trim());
      const res = await fetch(`/api/admin/email-logs?${params.toString()}`);
      if (!res.ok) return [];
      return res.json() as Promise<EmailLog[]>;
    },
  });

  const rows = logs || [];

  const handleExport = () => {
    exportToCSV(
      rows.map((r) => ({
        timestamp: format(new Date(r.created_at), 'yyyy-MM-dd HH:mm:ss'),
        to: r.to_address,
        from: r.from_address || '',
        subject: r.subject || '',
        status: r.status,
        sent_at: r.sent_at ? format(new Date(r.sent_at), 'yyyy-MM-dd HH:mm:ss') : '',
        error: r.error || '',
      })),
      `email-logs-${format(new Date(), 'yyyy-MM-dd')}`,
    );
  };

  return (
    <>
      <Head title="Email Logs" />
      <div>
        <div className="flex items-center justify-between mb-6">
          <div>
            <h1 className="text-2xl font-bold text-foreground flex items-center gap-2">
              <Mail className="h-6 w-6" /> Email Logs
            </h1>
            <p className="text-sm text-muted-foreground">
              Every outgoing email. Click a row to view the full message.
            </p>
          </div>
          <Button variant="outline" size="sm" onClick={handleExport} disabled={!rows.length}>
            <Download className="h-4 w-4 mr-1.5" /> Export CSV
          </Button>
        </div>

        <div className="flex flex-col sm:flex-row gap-3 mb-6">
          <div className="relative flex-1 max-w-md">
            <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" />
            <Input
              placeholder="Search recipient, subject, sender..."
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              className="pl-9"
            />
          </div>
          <Select value={statusFilter} onValueChange={setStatusFilter}>
            <SelectTrigger className="w-[160px]">
              <SelectValue placeholder="Status" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="all">All statuses</SelectItem>
              <SelectItem value="sent">Sent</SelectItem>
              <SelectItem value="sending">Sending</SelectItem>
              <SelectItem value="failed">Failed</SelectItem>
            </SelectContent>
          </Select>
        </div>

        <div className="bg-card border border-border rounded-xl overflow-hidden">
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead className="w-[160px]">Sent at</TableHead>
                <TableHead>To</TableHead>
                <TableHead>Subject</TableHead>
                <TableHead className="w-[110px]">Status</TableHead>
                <TableHead className="w-[180px]">From</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {isLoading ? (
                <TableRow><TableCell colSpan={5} className="text-center text-muted-foreground py-12">Loading...</TableCell></TableRow>
              ) : !rows.length ? (
                <TableRow><TableCell colSpan={5} className="text-center text-muted-foreground py-12">No emails sent yet.</TableCell></TableRow>
              ) : (
                rows.map((log) => (
                  <TableRow
                    key={log.id}
                    onClick={() => setSelected(log)}
                    className="cursor-pointer hover:bg-muted/50"
                  >
                    <TableCell className="text-xs text-muted-foreground whitespace-nowrap">
                      {format(new Date(log.sent_at || log.created_at), 'dd MMM yy HH:mm')}
                    </TableCell>
                    <TableCell className="text-sm font-medium">{log.to_address}</TableCell>
                    <TableCell className="text-sm truncate max-w-[400px]">{log.subject || '—'}</TableCell>
                    <TableCell>{statusBadge(log.status)}</TableCell>
                    <TableCell className="text-xs text-muted-foreground truncate max-w-[180px]">{log.from_address || '—'}</TableCell>
                  </TableRow>
                ))
              )}
            </TableBody>
          </Table>
        </div>
      </div>

      <Sheet open={!!selected} onOpenChange={(open) => !open && setSelected(null)}>
        <SheetContent side="right" className="w-full sm:max-w-2xl overflow-y-auto">
          {selected && (
            <>
              <SheetHeader>
                <SheetTitle className="text-lg">{selected.subject || '(no subject)'}</SheetTitle>
              </SheetHeader>
              <div className="space-y-4 mt-4 text-sm">
                <div className="grid grid-cols-[80px_1fr] gap-y-2 gap-x-3 text-xs">
                  <span className="text-muted-foreground">Status</span>
                  <span>{statusBadge(selected.status)}</span>

                  <span className="text-muted-foreground">From</span>
                  <span className="font-mono">{selected.from_address || '—'}</span>

                  <span className="text-muted-foreground">To</span>
                  <span className="font-mono">{selected.recipients?.to?.join(', ') || selected.to_address}</span>

                  {selected.recipients?.cc && (
                    <>
                      <span className="text-muted-foreground">Cc</span>
                      <span className="font-mono">{selected.recipients.cc.join(', ')}</span>
                    </>
                  )}
                  {selected.recipients?.bcc && (
                    <>
                      <span className="text-muted-foreground">Bcc</span>
                      <span className="font-mono">{selected.recipients.bcc.join(', ')}</span>
                    </>
                  )}

                  <span className="text-muted-foreground">Created</span>
                  <span>{format(new Date(selected.created_at), 'dd MMM yyyy HH:mm:ss')}</span>

                  {selected.sent_at && (
                    <>
                      <span className="text-muted-foreground">Sent</span>
                      <span>{format(new Date(selected.sent_at), 'dd MMM yyyy HH:mm:ss')}</span>
                    </>
                  )}
                </div>

                {selected.error && (
                  <div className="rounded-lg border border-red-200 bg-red-50 p-3">
                    <p className="text-xs font-semibold text-red-800 mb-1">Error</p>
                    <p className="text-xs text-red-700 whitespace-pre-line">{selected.error}</p>
                  </div>
                )}

                {selected.body_html ? (
                  <div>
                    <p className="text-xs font-semibold text-muted-foreground mb-2 uppercase">HTML body</p>
                    <iframe
                      title="Email preview"
                      srcDoc={selected.body_html}
                      className="w-full min-h-[480px] border border-border rounded-lg bg-white"
                      sandbox=""
                    />
                  </div>
                ) : selected.body_text ? (
                  <div>
                    <p className="text-xs font-semibold text-muted-foreground mb-2 uppercase">Text body</p>
                    <pre className="text-xs whitespace-pre-wrap bg-muted p-3 rounded-lg max-h-[480px] overflow-auto">{selected.body_text}</pre>
                  </div>
                ) : null}
              </div>
            </>
          )}
        </SheetContent>
      </Sheet>
    </>
  );
};

EmailLogsPage.layout = (page: ReactNode) => <AdminLayout>{page}</AdminLayout>;

export default EmailLogsPage;
