import { randomUUID } from "node:crypto";
import { NextResponse } from "next/server";
import { getDbPool } from "@/db";
import { getSession } from "@/lib/auth";
import { canOperateCapital, resolveInspectionTenant } from "@/lib/authorization";

export const runtime = "nodejs";

const decisions = ["approved", "approved_with_notes", "retriage", "rejected"] as const;

export async function POST(request: Request, { params }: { params: Promise<{ externalId: string }> }) {
  try {
    const session = await getSession();
    if (!session) return NextResponse.json({ error: "Faça login para registrar a análise." }, { status: 401 });
    if (!canOperateCapital(session)) return NextResponse.json({ error: "A análise técnica é exclusiva da operação Capital." }, { status: 403 });
    const { externalId } = await params;
    const body = await request.json();
    const tenantId = await resolveInspectionTenant(session, String(body.tenantId || ""));
    if (!tenantId) return NextResponse.json({ error: "Cliente da vistoria não encontrado ou inativo." }, { status: 404 });
    const db = getDbPool();
    const [rows] = await db.execute("SELECT id, vehicle_type, inspection_cycle FROM inspections WHERE tenant_id = ? AND external_id = ? LIMIT 1", [tenantId, externalId]);
    const inspection = (rows as { id: string; vehicle_type: string; inspection_cycle: number }[])[0];
    if (!inspection) return NextResponse.json({ error: "Vistoria não encontrada." }, { status: 404 });

    if (body.action === "request") {
      await db.execute("INSERT INTO inspection_reviews (id, inspection_id, review_status) VALUES (?, ?, 'requested')", [randomUUID(), inspection.id]);
      await db.execute("UPDATE inspections SET status = 'human_review' WHERE id = ?", [inspection.id]);
      return NextResponse.json({ message: "Análise humana solicitada." }, { status: 201 });
    }

    const analystName = session.name;
    const decision = String(body.decision || "");
    const comments = String(body.comments || "").trim();
    const reason = String(body.reason || "").trim();
    const confirmedFindings = String(body.confirmedFindings || "").trim();
    const discardedFindings = String(body.discardedFindings || "").trim();
    if (!comments || !reason || !decisions.includes(decision as (typeof decisions)[number])) {
      return NextResponse.json({ error: "Informe decisão, motivo e comentários." }, { status: 400 });
    }
    const [photoRows] = await db.execute(
      `SELECT COUNT(*) AS total FROM inspection_photos p LEFT JOIN inspection_photo_analyses a ON a.inspection_photo_id = p.id
       WHERE p.inspection_id = ? AND p.inspection_cycle = ? AND p.ai_status <> 'retriage' AND COALESCE(a.status, '') <> 'failed'`,
      [inspection.id, Number(inspection.inspection_cycle || 1)],
    );
    const requiredPhotos: Record<string, number> = { light: 8, motorcycle: 6, heavy: 6 };
    if (Number((photoRows as { total: number }[])[0]?.total || 0) < (requiredPhotos[inspection.vehicle_type] || 99)) return NextResponse.json({ error: "A decisão final só pode ser registrada após todas as fotos obrigatórias serem aceitas.", hint: "Solicite retriagem ou conclua as capturas pendentes." }, { status: 409 });
    const [pendingRows] = await db.execute("SELECT id FROM inspection_reviews WHERE inspection_id = ? AND review_status = 'requested' ORDER BY requested_at DESC LIMIT 1", [inspection.id]);
    const pending = (pendingRows as { id: string }[])[0];
    const values = [analystName, decision, comments, JSON.stringify(confirmedFindings ? confirmedFindings.split("\n").filter(Boolean) : []), JSON.stringify(discardedFindings ? discardedFindings.split("\n").filter(Boolean) : []), reason, "Padrão Capital (provisório)"];
    if (pending) {
      await db.execute("UPDATE inspection_reviews SET analyst_name = ?, review_status = 'completed', decision = ?, comments = ?, confirmed_findings = ?, discarded_findings = ?, reason = ?, rules_version = ?, completed_at = NOW() WHERE id = ?", [...values, pending.id]);
    } else {
      await db.execute("INSERT INTO inspection_reviews (id, inspection_id, analyst_name, review_status, decision, comments, confirmed_findings, discarded_findings, reason, rules_version, completed_at) VALUES (?, ?, ?, 'completed', ?, ?, ?, ?, ?, ?, NOW())", [randomUUID(), inspection.id, ...values]);
    }
    await db.execute("UPDATE inspections SET status = ?, completed_at = NOW() WHERE id = ?", [decision, inspection.id]);
    return NextResponse.json({ message: "Decisão humana registrada." });
  } catch (error: unknown) {
    console.error("Erro ao registrar análise humana", error);
    const code = typeof error === "object" && error && "code" in error ? String(error.code) : "";
    if (code === "ER_NO_SUCH_TABLE") return NextResponse.json({ error: "A tabela de análises humanas ainda não foi criada.", hint: "Execute a migration 002_inspection_reviews.sql." }, { status: 503 });
    return NextResponse.json({ error: "Não foi possível registrar a análise humana." }, { status: 500 });
  }
}
