import { readFile, writeFile, mkdir } from "node:fs/promises";
import { resolve, relative } from "node:path";
import { withTransaction, ensureInvestigation, now } from "../../db.js";

const REPO_ROOT = process.cwd();
const MAX_BODY = 100_000;

export async function ingestHttp(
  filePath: string,
  investigation: string,
  notes?: string,
): Promise<void> {
  const raw = await readFile(resolve(filePath), "utf-8");
  const data = JSON.parse(raw) as Record<string, unknown>;

  const url = (data.url as string) ?? "";
  const method = (data.method as string) ?? "GET";
  const reqHeaders = data.request_headers ?? {};
  const reqBody = (data.request_body as string) ?? "";
  const respStatus = (data.status_code as number) ?? null;
  const respHeaders = data.response_headers ?? {};
  const fullBody = (data.response_body as string) ?? "";
  const respBody = fullBody.slice(0, MAX_BODY);
  const session = (data.c_user as string) ?? "";

  let saved: string | null = null;
  if (fullBody.length > MAX_BODY) {
    const ts = new Date()
      .toISOString()
      .replace(/[-:T]/g, "")
      .replace(/\..+/, "")
      .replace(/^(\d{8})(\d{6})$/, "$1_$2");
    const archDir = resolve(REPO_ROOT, "archives");
    await mkdir(archDir, { recursive: true });
    const dest = resolve(archDir, `http_${ts}.json`);
    await writeFile(dest, JSON.stringify(data, null, 2), "utf-8");
    saved = relative(REPO_ROOT, dest);
  }

  await withTransaction(async (client) => {
    await ensureInvestigation(client, investigation);
    await client.query(
      `INSERT INTO http_log(
         investigation_id, url, method, request_headers, request_body,
         response_status, response_headers, response_body,
         file_path, collected_at, session_id, notes)
       VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)`,
      [
        investigation,
        url,
        method,
        JSON.stringify(reqHeaders),
        reqBody,
        respStatus,
        JSON.stringify(respHeaders),
        respBody,
        saved,
        now(),
        session,
        notes ?? null,
      ],
    );
  });

  console.log(`HTTP log saved: ${url.slice(0, 80)}`);
}
