import { AlertTriangle, CheckCircle2, Database, Trash2, XCircle } from 'lucide-react';

import { useState } from 'react';

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

import PageHeader from '@/Components/layout/PageHeader';
import { Alert, AlertDescription } from '@/Components/ui/alert';
import { Badge } from '@/Components/ui/badge';
import { Button } from '@/Components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/Components/ui/card';
import { useAdminKeyboardShortcuts } from '@/hooks/useAdminKeyboardShortcuts';
import { useNavigationState } from '@/hooks/useNavigationState';
import AdminLayout from '@/Layouts/AdminLayout';
import { cn } from '@/lib/utils';

interface HealthCheck {
  name: string;
  status: 'pass' | 'warn' | 'fail';
  count: number;
  details: Record<string, unknown>[];
}

interface Props {
  checks: Record<string, HealthCheck>;
  cleanable_checks: string[];
  error?: string | null;
}

const statusIcon = (status: string) => {
  switch (status) {
    case 'pass':
      return <CheckCircle2 className="h-5 w-5 text-success" />;
    case 'warn':
      return <AlertTriangle className="h-5 w-5 text-warning" />;
    case 'fail':
      return <XCircle className="h-5 w-5 text-destructive" />;
    default:
      return null;
  }
};

const statusBadge = (status: string) => {
  const variants: Record<string, 'default' | 'secondary' | 'destructive'> = {
    pass: 'default',
    warn: 'secondary',
    fail: 'destructive',
  };
  return <Badge variant={variants[status] ?? 'secondary'}>{status}</Badge>;
};

export default function Index({ checks, cleanable_checks, error }: Props) {
  const checkEntries = Object.entries(checks);
  const passCount = checkEntries.filter(([, c]) => c.status === 'pass').length;
  const issueCount = checkEntries.filter(([, c]) => c.status !== 'pass').length;
  const [cleaning, setCleaning] = useState<string | null>(null);
  const isNavigating = useNavigationState();

  useAdminKeyboardShortcuts({});

  const handleCleanup = (checkKey: string) => {
    setCleaning(checkKey);
    router.post(
      `/admin/data-health/cleanup/${checkKey}`,
      {},
      {
        onFinish: () => setCleaning(null),
      },
    );
  };

  return (
    <AdminLayout>
      <Head title="Data Health" />
      <div className={cn('container py-6 space-y-6', isNavigating && 'opacity-50 pointer-events-none')}>
        <PageHeader
          title="Data Integrity Health"
          description={`${passCount} checks passing, ${issueCount} issues detected`}
        />

        {error && (
          <Alert variant="destructive">
            <AlertTriangle className="h-4 w-4" />
            <AlertDescription>{error}</AlertDescription>
          </Alert>
        )}

        <div className="grid gap-4 md:grid-cols-2">
          {checkEntries.map(([key, check]) => {
            const isCleanable = cleanable_checks.includes(key) && check.count > 0;
            const isCleaning = cleaning === key;
            return (
              <Card key={key}>
                <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
                  <div className="flex items-center gap-2">
                    {statusIcon(check.status)}
                    <CardTitle className="text-sm font-medium">{check.name}</CardTitle>
                  </div>
                  {statusBadge(check.status)}
                </CardHeader>
                <CardContent>
                  <p className="text-2xl font-bold">{check.count}</p>
                  <p className="text-xs text-muted-foreground">
                    {check.count === 0
                      ? 'No issues found'
                      : `${check.count} issue${check.count !== 1 ? 's' : ''} detected`}
                  </p>
                  {check.details.length > 0 && (
                    <div className="mt-3 max-h-32 overflow-y-auto rounded border p-2">
                      <pre className="text-xs text-muted-foreground">
                        {JSON.stringify(check.details.slice(0, 5), null, 2)}
                      </pre>
                    </div>
                  )}
                  {isCleanable && (
                    <div className="mt-3">
                      <Button
                        variant="destructive"
                        size="sm"
                        disabled={isCleaning}
                        onClick={() => handleCleanup(key)}
                      >
                        <Trash2 className="mr-1.5 h-3.5 w-3.5" />
                        {isCleaning ? 'Cleaning…' : 'Clean up'}
                      </Button>
                    </div>
                  )}
                </CardContent>
              </Card>
            );
          })}
        </div>

        <Card>
          <CardHeader>
            <div className="flex items-center gap-2">
              <Database className="h-4 w-4 text-muted-foreground" />
              <CardTitle className="text-sm font-medium">Check Summary</CardTitle>
            </div>
          </CardHeader>
          <CardContent>
            <div className="flex gap-6">
              <div className="flex items-center gap-2">
                <CheckCircle2 className="h-4 w-4 text-success" />
                <span className="text-sm">{passCount} passing</span>
              </div>
              {issueCount > 0 && (
                <div className="flex items-center gap-2">
                  <AlertTriangle className="h-4 w-4 text-warning" />
                  <span className="text-sm">{issueCount} with issues</span>
                </div>
              )}
            </div>
          </CardContent>
        </Card>
      </div>
    </AdminLayout>
  );
}
