import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase-server";
import { canCompany, getCompanyContext } from "@/lib/company-context";
import { normalizarObservacoes } from "@/lib/orders/observacoes";

/**
 * Observações do pedido.
 *
 * O pedido herda as "Observações para o cliente" do orçamento enquanto não
 * tem as dele (lib/orders/observacoes.ts). Esta rota grava as do pedido, que
 * passam a valer na tela, e na nota fiscal, como informações complementares.
 *
 * Texto vazio é gravado como "" e não como NULL, de propósito: NULL quer dizer
 * "nunca mexeram", e traria a observação do orçamento de volta para quem
 * acabou de apagar.
 */
export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) {
  const { id } = await ctx.params;
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

  if (!user) {
    return NextResponse.json({ error: "Não autenticado." }, { status: 401 });
  }

  const companyCtx = await getCompanyContext(supabase, user);
  if (!canCompany(companyCtx, user.id, "orders.edit")) {
    return NextResponse.json({ error: "Sem permissão para editar pedido." }, { status: 403 });
  }

  const body = (await req.json().catch(() => null)) as { notes?: unknown } | null;
  if (!body || typeof body.notes !== "string") {
    return NextResponse.json({ error: "Informe as observações." }, { status: 400 });
  }
  const notes = normalizarObservacoes(body.notes);

  /* Confere o dono antes de gravar: sem isso, um id de outra empresa passaria
     pela permissão e cairia no update. */
  const tenantIds = companyCtx.tenantIds?.length ? companyCtx.tenantIds : [user.id];
  const { data: pedido, error: erroBusca } = await supabase
    .from("orders")
    .select("id")
    .eq("id", id)
    .in("user_id", tenantIds)
    .maybeSingle();

  if (erroBusca) {
    return NextResponse.json({ error: "Falha ao localizar o pedido." }, { status: 400 });
  }
  if (!pedido) {
    return NextResponse.json({ error: "Pedido não encontrado." }, { status: 404 });
  }

  const { error } = await supabase
    .from("orders")
    .update({ notes, updated_at: new Date().toISOString() })
    .eq("id", id);

  if (error) {
    return NextResponse.json({ error: "Falha ao salvar as observações." }, { status: 400 });
  }

  return NextResponse.json({
    ok: true,
    notes,
    message: notes ? "Observações atualizadas." : "Observações removidas.",
  });
}
