import { Radio, RefreshCw } from 'lucide-react';
import { toast } from 'sonner';

import { useState } from 'react';

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

import { ServiceStatusBadge } from '@/Components/CircuitBreaker/ServiceStatusBadge';
import PageHeader from '@/Components/layout/PageHeader';
import {
  Breadcrumb,
  BreadcrumbItem,
  BreadcrumbLink,
  BreadcrumbList,
  BreadcrumbPage,
  BreadcrumbSeparator,
} from '@/Components/ui/breadcrumb';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/Components/ui/card';
import { ConfirmDialog } from '@/Components/ui/confirm-dialog';
import { EmptyState } from '@/Components/ui/empty-state';
import { LoadingButton } from '@/Components/ui/loading-button';
import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from '@/Components/ui/table';
import AdminLayout from '@/Layouts/AdminLayout';
import { formatRelativeTime } from '@/lib/format';
import type { AdminCircuitBreakerProps } from '@/types/admin';

const SERVICE_DISPLAY_NAMES: Record<string, string> = {
  gsc_api: 'Google Search Console',
  openai_api: 'OpenAI API',
  wp_api: 'WordPress API',
};

export default function AdminCircuitBreaker({ circuits }: AdminCircuitBreakerProps) {
  const [resettingService, setResettingService] = useState<string | null>(null);
  const [confirmingService, setConfirmingService] = useState<string | null>(null);

  const handleReset = (service: string) => {
    setResettingService(service);
    router.post(
      `/admin/circuit-breaker/${service}/reset`,
      {},
      {
        onSuccess: () =>
          toast.success(`${SERVICE_DISPLAY_NAMES[service] ?? service} circuit breaker reset.`),
        onFinish: () => {
          setResettingService(null);
          setConfirmingService(null);
        },
      },
    );
  };

  return (
    <AdminLayout>
      <Head title="Admin - Circuit Breaker" />

      <div className="container py-6 space-y-6">
        <Breadcrumb>
          <BreadcrumbList>
            <BreadcrumbItem>
              <BreadcrumbLink asChild>
                <Link href="/admin">Admin</Link>
              </BreadcrumbLink>
            </BreadcrumbItem>
            <BreadcrumbSeparator />
            <BreadcrumbItem>
              <BreadcrumbPage>Circuit Breaker</BreadcrumbPage>
            </BreadcrumbItem>
          </BreadcrumbList>
        </Breadcrumb>

        <PageHeader title="Circuit Breaker" subtitle="External service health monitoring" />
        <Card>
          <CardHeader>
            <CardTitle>Service Status</CardTitle>
            <CardDescription>
              Monitor and manage circuit breaker states for external API connections
            </CardDescription>
          </CardHeader>
          <CardContent>
            {Object.keys(circuits).length === 0 ? (
              <EmptyState
                icon={Radio}
                title="No circuits configured"
                description="Circuit breaker monitoring will appear here once external services are configured."
                size="sm"
              />
            ) : (
              <div className="overflow-x-auto">
                <Table>
                  <TableHeader>
                    <TableRow>
                      <TableHead>Service</TableHead>
                      <TableHead>State</TableHead>
                      <TableHead>Failures</TableHead>
                      <TableHead>Last Failure</TableHead>
                      <TableHead className="text-right">Actions</TableHead>
                    </TableRow>
                  </TableHeader>
                  <TableBody>
                    {Object.entries(circuits).map(([service, circuit]) => (
                      <TableRow key={service}>
                        <TableCell className="font-medium">
                          {SERVICE_DISPLAY_NAMES[service] || service}
                        </TableCell>
                        <TableCell>
                          <ServiceStatusBadge state={circuit.state} aria-hidden="true" />
                          <span className="sr-only">
                            {SERVICE_DISPLAY_NAMES[service] ?? service} circuit breaker:{' '}
                            {circuit.state}
                          </span>
                        </TableCell>
                        <TableCell>
                          <span className="text-sm">
                            {circuit.failure_count} / {circuit.failure_threshold}
                          </span>
                        </TableCell>
                        <TableCell>
                          {circuit.last_failure_at ? (
                            <span className="text-sm text-muted-foreground">
                              {formatRelativeTime(circuit.last_failure_at)}
                            </span>
                          ) : (
                            <span className="text-sm text-muted-foreground">Never</span>
                          )}
                        </TableCell>
                        <TableCell className="text-right">
                          <LoadingButton
                            variant="outline"
                            size="sm"
                            onClick={() => setConfirmingService(service)}
                            disabled={circuit.state === 'closed' && circuit.failure_count === 0}
                            loading={resettingService === service}
                            loadingText="Resetting"
                          >
                            <RefreshCw className="h-4 w-4 mr-1" />
                            Reset
                          </LoadingButton>
                        </TableCell>
                      </TableRow>
                    ))}
                  </TableBody>
                </Table>
              </div>
            )}
          </CardContent>
        </Card>

        <Card>
          <CardHeader>
            <CardTitle>Circuit Breaker States</CardTitle>
          </CardHeader>
          <CardContent className="space-y-3">
            <div className="flex items-start gap-3">
              <ServiceStatusBadge state="closed" />
              <div>
                <p className="text-sm font-medium">Healthy</p>
                <p className="text-sm text-muted-foreground">
                  Circuit is closed, requests are flowing normally
                </p>
              </div>
            </div>
            <div className="flex items-start gap-3">
              <ServiceStatusBadge state="half-open" />
              <div>
                <p className="text-sm font-medium">Testing</p>
                <p className="text-sm text-muted-foreground">
                  Circuit is half-open, testing recovery with limited requests
                </p>
              </div>
            </div>
            <div className="flex items-start gap-3">
              <ServiceStatusBadge state="open" />
              <div>
                <p className="text-sm font-medium">Failing</p>
                <p className="text-sm text-muted-foreground">
                  Circuit is open, requests are blocked to prevent cascading failures
                </p>
              </div>
            </div>
          </CardContent>
        </Card>
      </div>

      <ConfirmDialog
        open={confirmingService !== null}
        onOpenChange={(open) => {
          if (!open) setConfirmingService(null);
        }}
        title="Reset circuit breaker"
        description={`Reset the circuit breaker for ${confirmingService ? (SERVICE_DISPLAY_NAMES[confirmingService] ?? confirmingService) : ''}? This will clear the failure count and close the circuit.`}
        confirmLabel="Reset"
        onConfirm={() => {
          if (confirmingService) handleReset(confirmingService);
        }}
      />
    </AdminLayout>
  );
}
