import { NextRequest, NextResponse } from "next/server";
import os from "os";
import { requireAdmin, unauthorized } from "@/lib/admin-auth";
import { logAdminActivity } from "@/lib/admin-activity";
import { getPool } from "@/lib/db";
import { requestMeta } from "@/lib/request-meta";

async function mysqlPingLatency(): Promise<{
  ok: boolean;
  latency_ms: number | null;
  error?: string;
}> {
  const start = Date.now();
  try {
    const pool = getPool();
    await pool.query("SELECT 1");
    return { ok: true, latency_ms: Date.now() - start };
  } catch (e) {
    return {
      ok: false,
      latency_ms: Date.now() - start,
      error: e instanceof Error ? e.message : "ping failed",
    };
  }
}

function diskPlaceholder() {
  try {
    // Node does not expose df natively; report free memory as host pressure signal
    // and leave disk mounts for a future agent / SNMP poller.
    return {
      available: false,
      note: "Disk metrics require host agent or SNMP (Phase F). Showing host freemem as proxy.",
      freemem_bytes: os.freemem(),
      totalmem_bytes: os.totalmem(),
    };
  } catch {
    return { available: false, note: "Unavailable on this host" };
  }
}

export async function GET(req: NextRequest) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();

  const meta = requestMeta(req);
  const mem = process.memoryUsage();
  const mysql = await mysqlPingLatency();

  let loadavg: number[] = [];
  try {
    loadavg = os.loadavg();
  } catch {
    loadavg = [];
  }

  await logAdminActivity({
    adminId: admin.id,
    username: admin.username,
    action: "view_infra",
    resource: "infra",
    outcome: "success",
    ip: meta.ip,
    userAgent: meta.userAgent,
  });

  return NextResponse.json({
    ok: true,
    process: {
      uptime_seconds: Math.round(process.uptime()),
      node_version: process.version,
      pid: process.pid,
      memory: {
        rss: mem.rss,
        heap_total: mem.heapTotal,
        heap_used: mem.heapUsed,
        external: mem.external,
        array_buffers: mem.arrayBuffers,
      },
    },
    host: {
      platform: os.platform(),
      arch: os.arch(),
      hostname: os.hostname(),
      uptime_seconds: Math.round(os.uptime()),
      loadavg,
      cpus: os.cpus()?.length || 0,
      freemem: os.freemem(),
      totalmem: os.totalmem(),
    },
    mysql,
    disk: diskPlaceholder(),
    snmp: [],
  });
}
