import { AlertTriangle, CheckCircle, Key, XCircle } from 'lucide-react';

import { useRef } from 'react';

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

import { AdminPagination } from '@/Components/admin/AdminPagination';
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 { Button } from '@/Components/ui/button';
import { ExportButton } from '@/Components/ui/export-button';
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 AdminLayout from '@/Layouts/AdminLayout';
import { formatRelativeTime } from '@/lib/format';
import type { PaginatedResponse } from '@/types';

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

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

interface Props {
  keys: PaginatedResponse<AiKeyRow>;
  stats: {
    total: number;
    validated: number;
    invalid: number;
    never_validated: number;
    consecutive_failures_gt0: number;
  };
  by_status: Record<string, number>;
  filters: Filters;
}

function validationStatusBadge(status: string | null, isValidated: boolean) {
  if (status === null) return <Badge variant="secondary">Not checked</Badge>;
  if (isValidated) return <Badge variant="default">valid</Badge>;
  if (status === 'rate_limited') return <Badge variant="outline">rate_limited</Badge>;
  if (status === 'quota_exceeded') return <Badge variant="outline">quota_exceeded</Badge>;
  return <Badge variant="destructive">{status}</Badge>;
}

const STATUS_OPTIONS = [
  { value: 'valid', label: 'Valid' },
  { value: 'invalid_auth', label: 'Invalid Auth' },
  { value: 'rate_limited', label: 'Rate Limited' },
  { value: 'quota_exceeded', label: 'Quota Exceeded' },
  { value: 'network_error', label: 'Network Error' },
  { value: 'provider_error', label: 'Provider Error' },
  { value: 'never_validated', label: 'Never Validated' },
];

export default function Index({ keys, stats, by_status, filters }: Props) {
  const { search, setSearch, updateFilter, handlePage, clearFilters } = useAdminFilters({
    route: '/admin/user-ai-keys',
    filters,
  });

  const searchInputRef = useRef<HTMLInputElement>(null);
  useAdminKeyboardShortcuts({ onSearch: () => searchInputRef.current?.focus() });

  const hasFilters = !!(filters.search || filters.status);

  const statCards: StatCard[] = [
    {
      title: 'Total Keys',
      value: stats.total,
      icon: Key,
    },
    {
      title: 'Validated',
      value: stats.validated,
      icon: CheckCircle,
    },
    {
      title: 'Invalid',
      value: stats.invalid,
      icon: XCircle,
      valueClassName: stats.invalid > 0 ? 'text-destructive' : '',
    },
    {
      title: 'Never Validated',
      value: stats.never_validated,
      icon: AlertTriangle,
      valueClassName: stats.never_validated > 0 ? 'text-warning' : '',
    },
  ];

  return (
    <AdminLayout>
      <Head title="BYOK 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>BYOK AI Keys</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <PageHeader
          title="BYOK AI Key Health"
          description="Validation status of user-supplied OpenAI API keys across all accounts"
        />

        <AdminStatsGrid stats={statCards} />

        {Object.keys(by_status).length > 0 && (
          <div className="flex flex-wrap gap-2">
            {Object.entries(by_status).map(([status, count]) => (
              <Badge key={status} variant="outline" className="gap-1 text-xs">
                {status}
                <span className="font-bold">{count}</span>
              </Badge>
            ))}
          </div>
        )}

        <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
          <div className="flex flex-1 gap-2">
            <Input
              ref={searchInputRef}
              placeholder="Search by email or name…"
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              className="max-w-xs"
            />
            <Select
              value={filters.status ?? 'all'}
              onValueChange={(val) => updateFilter({ status: val === 'all' ? '' : val })}
            >
              <SelectTrigger className="w-44">
                <SelectValue placeholder="All statuses" />
              </SelectTrigger>
              <SelectContent>
                <SelectItem value="all">All statuses</SelectItem>
                {STATUS_OPTIONS.map((opt) => (
                  <SelectItem key={opt.value} value={opt.value}>
                    {opt.label}
                  </SelectItem>
                ))}
              </SelectContent>
            </Select>
            {hasFilters && (
              <Button variant="ghost" size="sm" onClick={clearFilters}>
                Clear
              </Button>
            )}
          </div>
          <ExportButton href="/admin/user-ai-keys/export" label="Export CSV" />
        </div>

        <div className="rounded-md border">
          <Table>
            <TableHeader>
              <TableRow>
                <TableHead>User</TableHead>
                <TableHead>Provider</TableHead>
                <TableHead>Status</TableHead>
                <TableHead>Message</TableHead>
                <TableHead>Failures</TableHead>
                <TableHead>Last Checked</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {keys.data.length === 0 ? (
                <TableRow>
                  <TableCell colSpan={6} className="py-8 text-center text-muted-foreground">
                    {hasFilters ? 'No keys match the current filters.' : 'No BYOK keys registered.'}
                  </TableCell>
                </TableRow>
              ) : (
                keys.data.map((key) => (
                  <TableRow key={key.id}>
                    <TableCell>
                      <div className="font-medium text-sm">{key.user_name ?? '—'}</div>
                      <div className="text-xs text-muted-foreground">{key.user_email}</div>
                    </TableCell>
                    <TableCell>
                      <Badge variant="outline" className="text-xs capitalize">
                        {key.provider}
                      </Badge>
                    </TableCell>
                    <TableCell>
                      {validationStatusBadge(key.last_validation_status, key.is_validated)}
                    </TableCell>
                    <TableCell className="max-w-[260px] truncate text-xs text-muted-foreground">
                      {key.last_validation_message ?? '—'}
                    </TableCell>
                    <TableCell>
                      {key.consecutive_failures > 0 ? (
                        <span className="text-sm font-mono text-destructive">
                          {key.consecutive_failures}
                        </span>
                      ) : (
                        <span className="text-sm text-muted-foreground">0</span>
                      )}
                    </TableCell>
                    <TableCell className="text-sm text-muted-foreground">
                      {key.last_validation_at ? formatRelativeTime(key.last_validation_at) : '—'}
                    </TableCell>
                  </TableRow>
                ))
              )}
            </TableBody>
          </Table>
        </div>

        <AdminPagination
          currentPage={keys.current_page}
          lastPage={keys.last_page}
          from={keys.from}
          to={keys.to}
          total={keys.total}
          onPage={handlePage}
          label="keys"
        />
      </div>
    </AdminLayout>
  );
}
