"use client";
import { Suspense, useState, useEffect, useCallback } from "react";
import { useSearchParams, useRouter } from "next/navigation";
import { Activity, RefreshCw, CheckCircle2, AlertCircle, XCircle } from "lucide-react";
import { ToolLayout } from "@/components/ToolLayout";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { toast } from "sonner";

interface CheckResult {
  name: string;
  status: "ok" | "warn" | "err";
  message: string;
  records?: string[];
}

interface HealthData {
  domain: string;
  score: number;
  checks: CheckResult[];
  error?: string;
}

function DnsHealthContent() {
  const searchParams = useSearchParams();
  const router = useRouter();
  const [domain, setDomain] = useState(searchParams.get("domain") ?? "");
  const [loading, setLoading] = useState(false);
  const [data, setData] = useState<HealthData | null>(null);

  const updateUrl = useCallback((d: string) => {
    const params = new URLSearchParams();
    if (d) params.set("domain", d);
    router.replace(`/dns-health${params.toString() ? `?${params}` : ""}`, { scroll: false });
  }, [router]);

  const lookup = useCallback(async (d: string) => {
    if (!d.trim()) return;
    setLoading(true);
    setData(null);
    try {
      const res = await fetch(`/api/dns-health?domain=${encodeURIComponent(d)}`);
      const json = await res.json();
      setData(json);
    } catch {
      toast.error("Request failed");
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    const p = searchParams.get("domain");
    if (p) { setDomain(p); lookup(p); }
  // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); updateUrl(domain); lookup(domain); };

  const statusIcon = (s: "ok" | "warn" | "err") => {
    if (s === "ok") return <CheckCircle2 className="h-4 w-4 text-green-400 shrink-0" />;
    if (s === "warn") return <AlertCircle className="h-4 w-4 text-yellow-400 shrink-0" />;
    return <XCircle className="h-4 w-4 text-red-400 shrink-0" />;
  };

  const scoreColor = (s: number) => s >= 80 ? "text-green-400" : s >= 50 ? "text-yellow-400" : "text-red-400";

  return (
    <ToolLayout icon={Activity} title="DNS Health" description="Comprehensive DNS health check for your domain.">
      <form onSubmit={handleSubmit} className="flex gap-2 mb-6">
        <Input
          value={domain}
          onChange={(e) => setDomain(e.target.value)}
          placeholder="example.com"
          className="flex-1"
          onBlur={() => updateUrl(domain)}
        />
        <Button type="submit" disabled={loading}>
          {loading ? <RefreshCw className="h-4 w-4 animate-spin" /> : "Check"}
        </Button>
      </form>

      {data?.error && <div className="result-box p-4 badge-err animate-fade-up">Error: {data.error}</div>}

      {data && !data.error && (
        <div className="space-y-4 animate-fade-up">
          {/* Score */}
          <div className="glass-card rounded-xl p-5">
            <div className="flex items-center justify-between mb-3">
              <div>
                <p className="text-sm text-muted-foreground">DNS Health Score</p>
                <p className={`text-5xl font-bold mt-1 ${scoreColor(data.score)}`}>{data.score}</p>
                <p className="text-xs text-muted-foreground mt-1">/100</p>
              </div>
              <div className="relative h-20 w-20">
                <svg viewBox="0 0 36 36" className="w-full h-full -rotate-90">
                  <circle cx="18" cy="18" r="15.5" fill="none" stroke="rgba(255,255,255,0.06)" strokeWidth="3" />
                  <circle
                    cx="18" cy="18" r="15.5" fill="none"
                    stroke={data.score >= 80 ? "#34d399" : data.score >= 50 ? "#fbbf24" : "#f87171"}
                    strokeWidth="3"
                    strokeDasharray={`${(data.score / 100) * 97.4} 97.4`}
                    strokeLinecap="round"
                  />
                </svg>
              </div>
            </div>
            <div className="flex gap-3 text-xs text-muted-foreground">
              <span className="flex items-center gap-1"><CheckCircle2 className="h-3 w-3 text-green-400" />{data.checks.filter((c) => c.status === "ok").length} ok</span>
              <span className="flex items-center gap-1"><AlertCircle className="h-3 w-3 text-yellow-400" />{data.checks.filter((c) => c.status === "warn").length} warnings</span>
              <span className="flex items-center gap-1"><XCircle className="h-3 w-3 text-red-400" />{data.checks.filter((c) => c.status === "err").length} errors</span>
            </div>
          </div>

          {/* Checks */}
          <div className="glass-card rounded-xl divide-y divide-border/50">
            {data.checks.map((check, i) => (
              <div key={i} className="p-4">
                <div className="flex items-start gap-3">
                  {statusIcon(check.status)}
                  <div className="flex-1 min-w-0">
                    <div className="flex items-center justify-between gap-2">
                      <p className="text-sm font-medium">{check.name}</p>
                    </div>
                    <p className="text-xs text-muted-foreground mt-0.5">{check.message}</p>
                    {check.records && check.records.length > 0 && (
                      <div className="mt-2 flex flex-wrap gap-1">
                        {check.records.slice(0, 8).map((r, ri) => (
                          <span key={ri} className="text-[10px] font-mono badge-neutral px-1.5 py-0.5 rounded">{r}</span>
                        ))}
                        {check.records.length > 8 && (
                          <span className="text-[10px] text-muted-foreground">+{check.records.length - 8} more</span>
                        )}
                      </div>
                    )}
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      )}
    </ToolLayout>
  );
}

export default function DnsHealthPage() {
  return <Suspense><DnsHealthContent /></Suspense>;
}
