import { Key, Search, ShieldCheck, ShieldX } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminDataTable } from '@/Components/admin/AdminDataTable';
import { AdminStatsGrid, type StatCard } from '@/Components/admin/AdminStatsGrid';
import PageHeader from '@/Components/layout/PageHeader';
import { Badge } from '@/Components/ui/badge';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Input } from '@/Components/ui/input';
import {
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from '@/Components/ui/select';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import { useAdminFilters } from '@/hooks/useAdminFilters';
import { useAdminKeyboardShortcuts } from '@/hooks/useAdminKeyboardShortcuts';
import { useNavigationState } from '@/hooks/useNavigationState';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatRelativeTime } from '@/lib/format';

interface AiKeyRow {
  id: number;
  user_id: number;
  user_name: string | null;
  user_email: string | null;
  provider: string;
  is_validated: boolean;
  last_validation_status: string | null;
  last_validation_at: string | null;
  consecutive_failures: number;
  invalidated_at: string | null;
  created_at: string;
}

interface PaginatedKeys {
  data: AiKeyRow[];
  current_page: number;
  last_page: number;
  from: number | null;
  to: number | null;
  total: number;
}

interface Summary {
  total: number;
  valid: number;
  invalid: number;
  never_validated: number;
  rate_limited: number;
  quota_exceeded: number;
}

interface Filters extends Record<string, string | number | boolean | undefined> {
  search: string;
  status: string;
}

interface Props {
  keys: PaginatedKeys;
  summary: Summary;
  filters: Filters;
}

function validationStatusBadge(row: AiKeyRow) {
  if (row.is_validated) {
    return (
      <Badge variant="outline" className="border-success text-success">
        valid
      </Badge>
    );
  }
  if (!row.last_validation_status) {
    return <Badge variant="secondary">never validated</Badge>;
  }
  const colorMap: Record<string, string> = {
    rate_limited: 'text-warning border-warning',
    quota_exceeded: 'text-warning-high border-warning-high',
  };
  const isDestructive = row.last_validation_status === 'invalid_auth';
  const extra = colorMap[row.last_validation_status] ?? '';
  return (
    <Badge variant={isDestructive ? 'destructive' : 'outline'} className={extra}>
      {row.last_validation_status.replace(/_/g, ' ')}
    </Badge>
  );
}

export default function Index({ keys, summary, filters }: Props) {
  const searchRef = useRef<HTMLInputElement>(null);
  const isNavigating = useNavigationState();

  const { search, setSearch, updateFilter, handlePage } = useAdminFilters({
    route: '/admin/ai-keys',
    filters,
  });

  useAdminKeyboardShortcuts({
    onSearch: () => searchRef.current?.focus(),
    onNextPage: keys.current_page < keys.last_page ? () => handlePage(keys.current_page + 1) : undefined,
    onPrevPage: keys.current_page > 1 ? () => handlePage(keys.current_page - 1) : undefined,
  });

  const statCards: StatCard[] = [
    { title: 'Total Keys', value: summary.total, icon: Key },
    {
      title: 'Valid',
      value: summary.valid,
      icon: ShieldCheck,
      valueClassName: summary.valid > 0 ? 'text-success' : '',
    },
    {
      title: 'Invalid / Errors',
      value: summary.invalid,
      icon: ShieldX,
      valueClassName: summary.invalid > 0 ? 'text-destructive' : '',
    },
    { title: 'Never Validated', value: summary.never_validated, icon: Key },
  ];

  return (
    <AdminLayout>
      <Head title="AI Key Health" />
      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>AI Key Health</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <PageHeader
          title="AI Key Health"
          subtitle="BYOK OpenAI key validation status across all users"
        />

        <AdminStatsGrid stats={statCards} />

        {(summary.rate_limited > 0 || summary.quota_exceeded > 0) && (
          <div className="flex gap-2">
            {summary.rate_limited > 0 && (
              <Badge variant="outline" className="text-warning border-warning">
                {summary.rate_limited} rate-limited
              </Badge>
            )}
            {summary.quota_exceeded > 0 && (
              <Badge variant="outline" className="text-warning-high border-warning-high">
                {summary.quota_exceeded} quota exceeded
              </Badge>
            )}
          </div>
        )}

        <div className="flex gap-2">
          <div className="relative flex-1 max-w-sm">
            <Search className="absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
            <Input
              ref={searchRef}
              placeholder="Search by user email or name…"
              className="pl-8"
              value={search}
              onChange={(e) => setSearch(e.target.value)}
            />
          </div>
          <Select
            value={filters.status || 'all'}
            onValueChange={(v) => updateFilter({ status: v === 'all' ? '' : v })}
          >
            <SelectTrigger className="w-44">
              <SelectValue placeholder="All statuses" />
            </SelectTrigger>
            <SelectContent>
              <SelectItem value="all">All statuses</SelectItem>
              <SelectItem value="valid">Valid</SelectItem>
              <SelectItem value="invalid">Invalid / Errors</SelectItem>
              <SelectItem value="never_validated">Never Validated</SelectItem>
              <SelectItem value="rate_limited">Rate Limited</SelectItem>
              <SelectItem value="quota_exceeded">Quota Exceeded</SelectItem>
            </SelectContent>
          </Select>
        </div>

        <AdminDataTable
          isEmpty={keys.data.length === 0}
          isNavigating={isNavigating}
          pagination={keys}
          onPage={handlePage}
          paginationLabel="keys"
          emptyIcon={Key}
          emptyTitle="No AI keys found"
          emptyDescription="No users have configured a BYOK OpenAI key yet."
        >
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>User</TableHead>
                <TableHead>Provider</TableHead>
                <TableHead>Status</TableHead>
                <TableHead>Last Validated</TableHead>
                <TableHead>Failures</TableHead>
                <TableHead>Added</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {keys.data.map((row) => (
                <TableRow key={row.id}>
                  <TableCell>
                    <div>
                      <Link
                        href={`/admin/users/${row.user_id}`}
                        className="font-medium hover:underline"
                      >
                        {row.user_name ?? '—'}
                      </Link>
                      <p className="text-xs text-muted-foreground">{row.user_email}</p>
                    </div>
                  </TableCell>
                  <TableCell className="text-sm capitalize">{row.provider}</TableCell>
                  <TableCell>{validationStatusBadge(row)}</TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {row.last_validation_at ? formatRelativeTime(row.last_validation_at) : '—'}
                  </TableCell>
                  <TableCell className="text-sm font-mono">
                    {row.consecutive_failures > 0 ? (
                      <span className={row.consecutive_failures >= 3 ? 'text-destructive font-semibold' : ''}>
                        {row.consecutive_failures}
                      </span>
                    ) : (
                      '—'
                    )}
                  </TableCell>
                  <TableCell className="text-sm text-muted-foreground">
                    {formatRelativeTime(row.created_at)}
                  </TableCell>
                </TableRow>
              ))}
            </TableBody>
          </Table>
        </AdminDataTable>
      </div>
    </AdminLayout>
  );
}
