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

/*
  Recado da loja para o cliente, dentro do pedido.

  Antes o unico texto que a loja conseguia publicar no portal era a observacao
  do rastreio, que so existe quando ha entrega. Aviso de atraso, pedido de
  conferencia de arte ou qualquer combinado saia por WhatsApp, fora do sistema.
  Aqui o recado fica gravado no proprio pedido e aparece no portal.
*/

function normalizeText(value: unknown) {
  return String(value ?? "").trim();
}

export async function POST(req: Request, context: { params: Promise<{ id: string }> }) {
  const { id } = await context.params;

  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();

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

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

  const body = (await req.json().catch(() => null)) as { message?: unknown } | null;
  const mensagem = normalizeText(body?.message).slice(0, 1000);
  const tenantIds = companyCtx.tenantIds?.length ? companyCtx.tenantIds : [user.id];

  const { data: updated, error } = await supabase
    .from("orders")
    .update({
      client_message: mensagem || null,
      /* Sem recado, sem data: assim o portal nao mostra um aviso vazio com
         carimbo de hora. */
      client_message_at: mensagem ? new Date().toISOString() : null,
    })
    .eq("id", id)
    .in("user_id", tenantIds)
    .select("client_message,client_message_at")
    .maybeSingle();

  if (error) {
    const texto = String(error.message || "").toLowerCase();
    if (texto.includes("client_message")) {
      return NextResponse.json(
        { error: "Rode a migracao 20260903_recado_do_pedido_para_o_cliente.sql para liberar o recado." },
        { status: 400 }
      );
    }
    return NextResponse.json({ error: error.message }, { status: 400 });
  }

  if (!updated) {
    return NextResponse.json({ error: "Pedido nao encontrado." }, { status: 404 });
  }

  return NextResponse.json({ ok: true, data: updated });
}
