import { NextResponse } from "next/server";
import { getDbPool } from "@/db";
import { getSession } from "@/lib/auth";

export const runtime = "nodejs";
const clean = (value: unknown, max = 200) => String(value || "").trim().slice(0, max);
const digits = (value: unknown) => String(value || "").replace(/\D/g, "");

export async function PATCH(request: Request, { params }: { params: Promise<{ tenantId: string }> }) {
  const session = await getSession();
  if (!session || session.role !== "capital_admin") return NextResponse.json({ error: "Sem permissão." }, { status: 403 });
  try {
    const { tenantId } = await params;
    const body = await request.json() as Record<string, unknown>;
    const name = clean(body.name, 160), legalName = clean(body.legalName), cnpjValue = digits(body.cnpj), emailValue = clean(body.email, 190).toLowerCase(), stateValue = clean(body.addressState, 2).toUpperCase();
    if (!name) return NextResponse.json({ error: "Informe o nome da empresa." }, { status: 400 });
    if (cnpjValue && cnpjValue.length !== 14) return NextResponse.json({ error: "Informe um CNPJ com 14 dígitos." }, { status: 400 });
    if (emailValue && !/^\S+@\S+\.\S+$/.test(emailValue)) return NextResponse.json({ error: "Informe um e-mail corporativo válido." }, { status: 400 });
    if (stateValue && !/^[A-Z]{2}$/.test(stateValue)) return NextResponse.json({ error: "Informe a UF com duas letras." }, { status: 400 });
    const [result] = await getDbPool().execute(`UPDATE tenants SET name = ?, legal_name = ?, cnpj = ?, email = ?, phone = ?, postal_code = ?, address_street = ?, address_number = ?, address_complement = ?, address_district = ?, address_city = ?, address_state = ? WHERE id = ?`, [name, legalName || null, cnpjValue || null, emailValue || null, clean(body.phone, 30) || null, clean(body.postalCode, 12) || null, clean(body.addressStreet) || null, clean(body.addressNumber, 30) || null, clean(body.addressComplement, 100) || null, clean(body.addressDistrict, 100) || null, clean(body.addressCity, 100) || null, stateValue || null, tenantId]);
    if (!(result as { affectedRows?: number }).affectedRows) return NextResponse.json({ error: "Cliente não encontrado." }, { status: 404 });
    return NextResponse.json({ message: "Dados da empresa atualizados." });
  } catch (error: unknown) { const code = typeof error === "object" && error && "code" in error ? String(error.code) : ""; return NextResponse.json({ error: code === "ER_DUP_ENTRY" ? "Já existe outro cliente com este CNPJ." : "Não foi possível atualizar os dados da empresa." }, { status: 400 }); }
}
