import { ReactNode } from "react";
import { Head, router } from '@inertiajs/react';
import { useQuery } from "@tanstack/react-query";
import AdminLayout from '@/layouts/AdminLayout';
import { useAuth } from "@/hooks/useAuth";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { ArrowLeft, Award, BookOpen, AlertTriangle, CheckCircle2, XCircle, Download } from "lucide-react";
import { differenceInDays, format } from "date-fns";

const expiryBadge = (expiresAt: string | null) => {
  if (!expiresAt) return <Badge variant="outline">No Expiry</Badge>;
  const days = differenceInDays(new Date(expiresAt), new Date());
  if (days < 0) return <Badge variant="destructive">Expired</Badge>;
  if (days <= 30) return <Badge className="bg-amber-500 text-white">{days}d left</Badge>;
  if (days <= 90) return <Badge variant="outline">{days}d left</Badge>;
  return <Badge variant="default">Valid</Badge>;
};

interface DelegateDetailProps {
  id?: string;
}

const DelegateDetail = ({ id: idProp }: DelegateDetailProps = {}) => {
  const id = idProp ?? window.location.pathname.split('/').pop();
  const { companyId, isSysLevel } = useAuth();

  const { data: delegate, isLoading } = useQuery({
    queryKey: ["delegate-detail", id],
    queryFn: async () => {
      const res = await fetch(`/api/admin/delegates/${id}`);
      if (!res.ok) return null;
      return res.json();
    },
    enabled: !!id,
  });

  // Certificates for this delegate
  const { data: certificates } = useQuery({
    queryKey: ["delegate-certs", delegate?.email],
    queryFn: async () => {
      const res = await fetch(`/api/admin/delegates/${id}/certificates`);
      if (!res.ok) return [];
      return res.json();
    },
    enabled: !!delegate?.email,
  });

  // Orders where this delegate appears (via booking_delegates)
  const { data: bookingHistory } = useQuery({
    queryKey: ["delegate-bookings", delegate?.email, delegate?.first_name, delegate?.last_name],
    queryFn: async () => {
      const res = await fetch(`/api/admin/delegates/${id}/bookings`);
      if (!res.ok) return [];
      return res.json();
    },
    enabled: !!delegate,
  });

  // Job roles assigned to this delegate
  const { data: assignedRoles } = useQuery({
    queryKey: ["delegate-jobroles", id],
    queryFn: async () => {
      const res = await fetch(`/api/admin/delegates/${id}/job-roles`);
      if (!res.ok) return [];
      return res.json();
    },
    enabled: !!id,
  });

  // Get requirements for assigned roles
  const { data: roleRequirements } = useQuery({
    queryKey: ["delegate-role-reqs", assignedRoles?.map((r: any) => r.job_role_id)],
    queryFn: async () => {
      if (!assignedRoles?.length) return [];
      const ids = assignedRoles.map((r: any) => r.job_role_id).join(',');
      const res = await fetch(`/api/admin/job-roles/requirements?ids=${ids}`);
      if (!res.ok) return [];
      return res.json();
    },
    enabled: !!assignedRoles && assignedRoles.length > 0,
  });

  // Access check
  if (!isSysLevel() && delegate && companyId && delegate.company_id !== companyId) {
    return (
      <>
        <Head title="Delegate" />
        <div className="text-center py-12 text-muted-foreground">Access denied.</div>
      </>
    );
  }

  if (isLoading) {
    return (
      <>
        <Head title="Delegate" />
        <div className="text-muted-foreground py-8">Loading delegate...</div>
      </>
    );
  }

  if (!delegate) {
    return (
      <>
        <Head title="Delegate" />
        <div className="text-center py-12 text-muted-foreground">Delegate not found.</div>
      </>
    );
  }

  // Compliance check
  const now = new Date();
  const complianceItems = (roleRequirements || []).map((req: any) => {
    const cert = certificates?.find(
      (c: any) =>
        c.course_id === req.course_id &&
        c.status === "active" &&
        (!c.expires_at || differenceInDays(new Date(c.expires_at), now) >= 0)
    );
    const expiring = cert?.expires_at
      ? differenceInDays(new Date(cert.expires_at), now) <= 30
      : false;

    return {
      courseTitle: (req as any).course?.title || "Unknown Course",
      courseId: req.course_id,
      isMandatory: req.is_mandatory,
      status: cert ? (expiring ? "expiring" : "valid") : "missing",
      expiresAt: cert?.expires_at || null,
    };
  });

  const mandatoryTotal = complianceItems.filter((i: any) => i.isMandatory).length;
  const mandatoryMet = complianceItems.filter((i: any) => i.isMandatory && i.status === "valid").length;
  const compliancePct = mandatoryTotal > 0 ? Math.round((mandatoryMet / mandatoryTotal) * 100) : null;

  return (
    <>
      <Head title={`${delegate.first_name} ${delegate.last_name}`} />
      <div>
        {/* Header */}
        <div className="flex items-center gap-3 mb-6">
          <Button variant="ghost" size="icon" onClick={() => window.history.back()}>
            <ArrowLeft className="h-4 w-4" />
          </Button>
          <div>
            <h1 className="text-2xl font-bold text-foreground">
              {delegate.first_name} {delegate.last_name}
            </h1>
            <div className="flex items-center gap-2 mt-1">
              <Badge variant={delegate.status === "active" ? "default" : "secondary"}>
                {delegate.status}
              </Badge>
              {delegate.email && (
                <span className="text-sm text-muted-foreground">{delegate.email}</span>
              )}
              {delegate.phone && (
                <span className="text-sm text-muted-foreground">· {delegate.phone}</span>
              )}
            </div>
          </div>
          {compliancePct !== null && (
            <div className="ml-auto text-right">
              <p className="text-2xl font-bold text-foreground">{compliancePct}%</p>
              <p className="text-xs text-muted-foreground">Compliance</p>
            </div>
          )}
        </div>

        {/* Job Roles */}
        {assignedRoles && assignedRoles.length > 0 && (
          <div className="flex gap-2 mb-6">
            {assignedRoles.map((ar: any) => (
              <Badge key={ar.id} variant="outline">
                {(ar as any).job_role?.title || "Unknown Role"}
              </Badge>
            ))}
          </div>
        )}

        <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
          {/* Compliance Checklist */}
          {complianceItems.length > 0 && (
            <Card>
              <CardHeader>
                <CardTitle className="text-base flex items-center gap-2">
                  <CheckCircle2 className="h-4 w-4" /> Compliance Checklist
                </CardTitle>
              </CardHeader>
              <CardContent>
                <div className="space-y-2">
                  {complianceItems.map((item: any, i: number) => (
                    <div key={i} className="flex items-center justify-between py-2 border-b border-border last:border-0">
                      <div className="flex items-center gap-2">
                        {item.status === "valid" && <CheckCircle2 className="h-4 w-4 text-green-500" />}
                        {item.status === "expiring" && <AlertTriangle className="h-4 w-4 text-amber-500" />}
                        {item.status === "missing" && <XCircle className="h-4 w-4 text-destructive" />}
                        <span className="text-sm">{item.courseTitle}</span>
                        {item.isMandatory && <Badge variant="outline" className="text-[10px]">Required</Badge>}
                      </div>
                      <div>
                        {item.status === "valid" && item.expiresAt && (
                          <span className="text-xs text-muted-foreground">
                            Expires {format(new Date(item.expiresAt), "dd MMM yyyy")}
                          </span>
                        )}
                        {item.status === "expiring" && (
                          <Badge className="bg-amber-500 text-white text-[10px]">Expiring soon</Badge>
                        )}
                        {item.status === "missing" && (
                          <Button
                            variant="link"
                            size="sm"
                            className="text-xs h-auto p-0"
                            onClick={() => router.visit(`/courses`)}
                          >
                            Book course
                          </Button>
                        )}
                      </div>
                    </div>
                  ))}
                </div>
              </CardContent>
            </Card>
          )}

          {/* Certificates */}
          <Card>
            <CardHeader>
              <CardTitle className="text-base flex items-center gap-2">
                <Award className="h-4 w-4" /> Certificates ({certificates?.length || 0})
              </CardTitle>
            </CardHeader>
            <CardContent>
              {!certificates?.length ? (
                <p className="text-sm text-muted-foreground py-4 text-center">No certificates yet.</p>
              ) : (
                <div className="space-y-2">
                  {certificates.map((c: any) => (
                    <div key={c.id} className="flex items-center justify-between gap-3 py-2 border-b border-border last:border-0">
                      <div className="min-w-0">
                        <p className="text-sm font-medium truncate">{c.course_title || c.qualification_name || "Certificate"}</p>
                        <p className="text-xs text-muted-foreground">
                          Issued {format(new Date(c.issued_at), "dd MMM yyyy")}
                          {c.certificate_number && ` · #${c.certificate_number}`}
                        </p>
                      </div>
                      <div className="flex items-center gap-3 shrink-0">
                        {c.certificate_url ? (
                          <a
                            href={c.certificate_url}
                            target="_blank"
                            rel="noopener noreferrer"
                            className="inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline"
                          >
                            <Download className="h-3.5 w-3.5" /> Download
                          </a>
                        ) : (
                          <span className="text-xs text-muted-foreground italic">No file</span>
                        )}
                        {expiryBadge(c.expires_at)}
                      </div>
                    </div>
                  ))}
                </div>
              )}
            </CardContent>
          </Card>
        </div>

        {/* Training History */}
        <Card className="mt-6">
          <CardHeader>
            <CardTitle className="text-base flex items-center gap-2">
              <BookOpen className="h-4 w-4" /> Training History
            </CardTitle>
          </CardHeader>
          <CardContent>
            {!bookingHistory?.length ? (
              <p className="text-sm text-muted-foreground py-4 text-center">No training history found.</p>
            ) : (
              <Table>
                <TableHeader>
                  <TableRow>
                    <TableHead>Course</TableHead>
                    <TableHead>Date</TableHead>
                    <TableHead>Status</TableHead>
                  </TableRow>
                </TableHeader>
                <TableBody>
                  {bookingHistory.map((o: any) => (
                    <TableRow key={o.id}>
                      <TableCell className="font-medium">{(o as any).course?.title || "—"}</TableCell>
                      <TableCell>{o.start_date ? format(new Date(o.start_date), "dd MMM yyyy") : "—"}</TableCell>
                      <TableCell>
                        <Badge variant={o.status === "paid" || o.status === "confirmed" ? "default" : "secondary"}>
                          {o.status}
                        </Badge>
                      </TableCell>
                    </TableRow>
                  ))}
                </TableBody>
              </Table>
            )}
          </CardContent>
        </Card>
      </div>
    </>
  );
};

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

export default DelegateDetail;
