import { useState } from 'react';

import { Head, Link, router } from '@inertiajs/react';

import { Badge } from '@/Components/ui/badge';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Button } from '@/Components/ui/button';
import { ConfirmDialog } from '@/Components/ui/confirm-dialog';
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/Components/ui/select';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatDate } from '@/lib/format';

interface Timeline {
  detected_at: string;
  notification_deadline: string;
  notified_at: string | null;
  gdpr_hours: number;
  hours_remaining: number;
  is_overdue: boolean;
}

interface Incident {
  id: number;
  description: string;
  severity: string;
  affected_count: number;
  status: string;
  is_notified: boolean;
  is_overdue: boolean;
  detected_at: string;
  notification_deadline: string;
  notified_at: string | null;
  audit_reference: string | null;
}

interface ShowProps {
  incident: Incident;
  timeline: Timeline;
}

export default function BreachIncidentShow({ incident, timeline }: ShowProps) {
  const [pendingStatus, setPendingStatus] = useState<string | null>(null);

  const applyStatus = (status: string) => {
    router.patch(route('admin.breach-incidents.update', incident.id), { status });
  };

  const handleStatusChange = (status: string) => {
    if (status === 'notified' && !incident.is_notified) {
      setPendingStatus(status);
    } else {
      applyStatus(status);
    }
  };

  return (
    <AdminLayout>
      <Head title={`Breach #${incident.id}`} />
      <div className="container py-6 space-y-6 max-w-3xl">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage aria-current={undefined} className="text-muted-foreground">
                GDPR
              </BreadcrumbPage>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href={route('admin.breach-incidents.index')}>Breach Incidents</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Breach #{incident.id}</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <div className="flex items-center justify-between">
          <div>
            <h1 className="text-2xl font-semibold text-foreground">
              Breach Incident #{incident.id}
            </h1>
            <p className="text-muted-foreground mt-1">{incident.description}</p>
          </div>
          <Badge variant={incident.severity === 'critical' ? 'destructive' : 'secondary'}>
            {incident.severity}
          </Badge>
        </div>

        <div className="rounded-lg border border-border bg-card p-6 space-y-4">
          <h2 className="font-semibold text-foreground">GDPR Timeline</h2>

          <div className="grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm">
            <div>
              <p className="text-muted-foreground">Detected at</p>
              <p className="font-medium text-foreground">{formatDate(timeline.detected_at)}</p>
            </div>
            <div>
              <p className="text-muted-foreground">72-hour Deadline</p>
              <p
                className={`font-medium ${timeline.is_overdue ? 'text-destructive' : 'text-foreground'}`}
              >
                {formatDate(timeline.notification_deadline)}
                {timeline.is_overdue && ' (OVERDUE)'}
              </p>
            </div>
            <div>
              <p className="text-muted-foreground">Hours Remaining</p>
              <p
                className={`font-medium ${timeline.hours_remaining < 12 ? 'text-destructive' : 'text-foreground'}`}
              >
                {timeline.is_overdue ? 'Overdue' : `${Math.round(timeline.hours_remaining)}h`}
              </p>
            </div>
            <div>
              <p className="text-muted-foreground">Notified at</p>
              <p className="font-medium text-foreground">
                {timeline.notified_at ? formatDate(timeline.notified_at) : 'Not yet notified'}
              </p>
            </div>
          </div>

          <div className="pt-2 border-t border-border">
            <p className="text-sm text-muted-foreground mb-2">
              Affected users: <strong>{incident.affected_count}</strong>
            </p>
          </div>
        </div>

        <div className="rounded-lg border border-border bg-card p-6 space-y-4">
          <h2 className="font-semibold text-foreground">Status Management</h2>
          <div className="flex items-center gap-4">
            <Select value={incident.status} onValueChange={handleStatusChange}>
              <SelectTrigger className="w-48">
                <SelectValue />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="detected">Detected</SelectItem>
                <SelectItem value="notified">Notified</SelectItem>
                <SelectItem value="dpa_notified">DPA Notified</SelectItem>
                <SelectItem value="closed">Closed</SelectItem>
              </SelectContent>
            </Select>
            <p className="text-sm text-muted-foreground">
              Setting to "Notified" will trigger user notifications if not already sent.
            </p>
          </div>
        </div>

        <div className="flex justify-between">
          <Button
            variant="outline"
            onClick={() => router.visit(route('admin.breach-incidents.index'))}
          >
            Back to List
          </Button>
        </div>
      </div>

      <ConfirmDialog
        open={pendingStatus !== null}
        onOpenChange={(open) => {
          if (!open) setPendingStatus(null);
        }}
        title="Send breach notifications?"
        description={`This will trigger notification emails to all ${incident.affected_count} affected users. This action cannot be undone.`}
        confirmLabel="Send Notifications"
        variant="destructive"
        onConfirm={() => {
          if (pendingStatus) applyStatus(pendingStatus);
          setPendingStatus(null);
        }}
      />
    </AdminLayout>
  );
}
