// src/lib/spec/audit/persist.ts — persistance du résultat d'audit, partagée
// entre la Server Action (actions.ts) et le tool MCP run_site_audit.
// Invariant : une seule ligne par site (unique site_audits_site_unique) —
// le re-run remplace score/results/ranAt, l'id d'origine est conservé.
import "server-only";
import { randomUUID } from "node:crypto";
import { db } from "@/lib/db/client";
import { siteAudits } from "@/lib/db/domain-schema";
import type { AuditResult } from "./run";

/** Pass/fail/warn counts over `results`, mirroring the score's denominator
 *  (na/manual excluded — see runSiteAudit). Denormalized onto the row so
 *  overview reads never need to load the jsonb. */
function countStatuses(result: AuditResult): {
  passCount: number;
  failCount: number;
  warnCount: number;
} {
  let passCount = 0;
  let failCount = 0;
  let warnCount = 0;
  for (const r of result.results) {
    if (r.status === "pass") passCount++;
    else if (r.status === "fail") failCount++;
    else if (r.status === "warn") warnCount++;
  }
  return { passCount, failCount, warnCount };
}

export async function persistSiteAudit(
  siteId: string,
  result: AuditResult,
): Promise<void> {
  const { passCount, failCount, warnCount } = countStatuses(result);
  await db
    .insert(siteAudits)
    .values({
      id: randomUUID(),
      siteId,
      score: result.score,
      results: result.results,
      passCount,
      failCount,
      warnCount,
    })
    .onConflictDoUpdate({
      target: siteAudits.siteId,
      set: {
        score: result.score,
        results: result.results,
        ranAt: new Date(),
        passCount,
        failCount,
        warnCount,
      },
    });
}
