import { NextResponse } from "next/server";
import { db } from "@/lib/db";
import { sql } from "drizzle-orm";

export async function GET() {
  const checks: Record<string, "ok" | "fail"> = {};
  const details: Record<string, string> = {};

  // 1. DATABASE_URL presente
  checks.database_url = process.env.DATABASE_URL ? "ok" : "fail";
  details.database_url = process.env.DATABASE_URL
    ? `set (host=${process.env.DATABASE_URL!.split("@")[1]?.split("/")[0] ?? "unknown"})`
    : "missing";

  // 2. DB conectable
  try {
    const result = await db.execute(sql`SELECT 1 as check_val`);
    checks.database_connection = "ok";
    details.database_connection = "query succeeded";
  } catch (err: unknown) {
    checks.database_connection = "fail";
    details.database_connection = String(err);
  }

  // 3. Tablas existen (query rápida a pg_catalog)
  try {
    const tables = await db.execute(sql`
      SELECT count(*) as cnt FROM information_schema.tables
      WHERE table_schema = 'public'
    `);
    const count = (tables as any)[0]?.cnt ?? "0";
    checks.database_tables = "ok";
    details.database_tables = `${count} tables in public schema`;
  } catch (err: unknown) {
    checks.database_tables = "fail";
    details.database_tables = String(err);
  }

  // 4. ENV críticos
  const criticalEnv = [
    "OPENAI_API_KEY",
    "MISTRAL_API_KEY",
    "SUPABASE_URL",
    "SUPABASE_ANON_KEY",
  ];
  for (const key of criticalEnv) {
    const val = process.env[key];
    if (key === "SUPABASE_URL") {
      checks[key.toLowerCase()] = val ? "ok" : "fail";
      details[key.toLowerCase()] = val ? `set (${val})` : "missing";
    } else if (key === "OPENAI_API_KEY" || key === "MISTRAL_API_KEY") {
      checks[key.toLowerCase()] = val ? "ok" : "fail";
      details[key.toLowerCase()] = val ? "set (key length: " + val.length + ")" : "missing";
    } else {
      checks[key.toLowerCase()] = val ? "ok" : "fail";
      details[key.toLowerCase()] = val ? "set" : "missing";
    }
  }

  const overall = Object.values(checks).every(v => v === "ok") ? "healthy" : "degraded";
  const status = overall === "healthy" ? 200 : 503;

  return new Response(JSON.stringify({
    status: overall,
    timestamp: new Date().toISOString(),
    checks,
    details,
  }, null, 2), {
    status,
    headers: { "Content-Type": "application/json" },
  });
}
