import { NextResponse } from "next/server";
import { pool } from "@/lib/mysql";
import type { RowDataPacket } from "mysql2";

type RecordRow = RowDataPacket & { payload: string | object; completed: number; score: number | null };

export async function GET(_request: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;
  const [rows] = await pool.execute<RecordRow[]>("SELECT payload, completed, score FROM audit_records WHERE audit_id = ? LIMIT 1", [Number(id)]);
  if (!rows.length) return NextResponse.json(null);
  const payload = typeof rows[0].payload === "string" ? JSON.parse(rows[0].payload) : rows[0].payload;
  return NextResponse.json({ ...payload, completed: Boolean(rows[0].completed), score: rows[0].score });
}

export async function PUT(request: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;
  const body = await request.json() as { answers?: object; residents?: object[]; auditor?: string; date?: string; completed?: boolean; score?: number };
  const auditId = Number(id);
  if (!Number.isInteger(auditId) || auditId < 1) return NextResponse.json({ error: "Invalid audit ID" }, { status: 400 });
  const payload = JSON.stringify({ answers: body.answers ?? {}, residents: body.residents ?? [], auditor: body.auditor ?? "", date: body.date ?? "" });
  await pool.execute(
    `INSERT INTO audit_records (audit_id, payload, completed, score) VALUES (?, ?, ?, ?)
     ON DUPLICATE KEY UPDATE payload = VALUES(payload), completed = VALUES(completed), score = VALUES(score), updated_at = CURRENT_TIMESTAMP`,
    [auditId, payload, body.completed ? 1 : 0, body.score ?? null],
  );
  await pool.execute(
    "UPDATE audit_settings SET is_draft = ?, status = IF(?, 'completed', status), due_label = IF(?, 'Completed', due_label), score = ? WHERE audit_id = ?",
    [body.completed ? 0 : 1, body.completed ? 1 : 0, body.completed ? 1 : 0, body.score ?? null, auditId],
  );
  return NextResponse.json({ ok: true });
}

