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

export const runtime = "nodejs";

const assessments = new Set(["no_damage", "damage_light", "damage_moderate", "damage_severe", "damage_structural", "plate_divergent", "chassis_divergent"]);
export async function POST(request: Request, { params }: { params: Promise<{ externalId: string; photoId: string }> }) {
  try {
    const session = await getSession();
    if (!session) return NextResponse.json({ error: "Faça login para classificar a foto." }, { status: 401 });
    if (!canOperateCapital(session)) return NextResponse.json({ error: "A classificação técnica é exclusiva da operação Capital." }, { status: 403 });
    const { externalId, photoId } = await params;
    const body = await request.json();
    const assessment = String(body.assessment || "");
    const damageLocation = String(body.damageLocation || "").trim().slice(0, 160);
    const comments = String(body.comments || "").trim();
    if (!assessments.has(assessment)) return NextResponse.json({ error: "Selecione uma classificação válida para a foto." }, { status: 400 });

    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 [photos] = await db.execute(
      `SELECT p.id FROM inspection_photos p
       INNER JOIN inspections i ON i.id = p.inspection_id
       WHERE p.id = ? AND i.external_id = ? AND i.tenant_id = ? AND p.inspection_cycle = i.inspection_cycle LIMIT 1`,
      [photoId, externalId, tenantId],
    );
    if (!(photos as { id: string }[])[0]) return NextResponse.json({ error: "Foto não encontrada na vistoria atual." }, { status: 404 });

    const name = session.name;
    await db.execute(
      `INSERT INTO inspection_photo_manual_assessments
       (id, inspection_photo_id, analyst_name, assessment, damage_location, comments)
       VALUES (?, ?, ?, ?, ?, ?)
       ON DUPLICATE KEY UPDATE analyst_name = VALUES(analyst_name), assessment = VALUES(assessment),
         damage_location = VALUES(damage_location), comments = VALUES(comments), updated_at = NOW()`,
      [randomUUID(), photoId, name, assessment, damageLocation || null, comments || null],
    );
    if (comments) {
      await db.execute(
        `INSERT INTO inspection_photo_comments (id, inspection_photo_id, analyst_name, comment)
         VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE comment = VALUES(comment), updated_at = NOW()`,
        [randomUUID(), photoId, name, comments],
      );
    }
    const result = await evaluateInspectionRules(tenantId, externalId);
    return NextResponse.json({ analystName: name, score: result.score, decision: result.decision, triggered: result.triggered, message: `Classificação salva. Pontuação recalculada: ${result.score} pts.` });
  } catch (error) {
    console.error("Erro ao salvar avaliação manual da foto", error);
    const code = (error as { code?: string }).code;
    if (code === "ER_NO_SUCH_TABLE") return NextResponse.json({ error: "A estrutura de classificações manuais ainda não foi instalada.", hint: "Execute a migration 010_manual_photo_assessments.sql no banco e tente novamente." }, { status: 503 });
    return NextResponse.json({ error: "Não foi possível salvar a classificação da foto." }, { status: 500 });
  }
}
