import { NextResponse } from "next/server";

import { canCompany } from "@/lib/company-context";
import { produtosDoLote } from "@/lib/assistentes/importacao/servidor";
import { acessoDoPainel, pedidoDaPropriaTela, RECUSA_DE_ORIGEM, recusaDoPainel } from "@/lib/assistentes/painel";
import { avisarLoja } from "@/lib/loja/avisar-loja";
import { createClient } from "@/lib/supabase-server";

export const runtime = "nodejs";

const SO_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

/**
 * Publica na loja virtual os produtos de uma importação (os que ainda
 * existem). Grava com a sessão da pessoa, então as travas do banco valem como
 * na tela de produtos, e pede a permissão de publicar.
 *
 * Apagar o lote não passa por aqui: a tela usa a exclusão de produtos do
 * painel, que já confere orçamentos e pedidos ligados a cada produto.
 */
export async function POST(request: Request, contexto: { params: Promise<{ id: string }> }) {
  if (!pedidoDaPropriaTela(request)) return RECUSA_DE_ORIGEM();
  const acesso = await acessoDoPainel();
  if (!acesso.ok) return recusaDoPainel(acesso.motivo);
  if (!canCompany(acesso.empresa, acesso.user.id, "catalog.products.write")) {
    return NextResponse.json({ error: "Sem permissão para publicar produtos na loja virtual." }, { status: 403 });
  }

  const { id } = await contexto.params;
  if (!SO_UUID.test(id)) return NextResponse.json({ error: "Importação inválida." }, { status: 400 });
  const corpo = (await request.json().catch(() => null)) as { acao?: unknown } | null;
  if (corpo?.acao !== "publicar") return NextResponse.json({ error: "Ação desconhecida." }, { status: 400 });

  try {
    const ids = await produtosDoLote(acesso.admin, acesso.empresa.companyId, id);
    if (ids === null) return NextResponse.json({ error: "Importação não encontrada." }, { status: 404 });
    if (!ids.length) return NextResponse.json({ publicados: 0 }, { headers: { "Cache-Control": "no-store" } });

    const supabase = await createClient();
    let publicados = 0;
    for (let inicio = 0; inicio < ids.length; inicio += 200) {
      const { data, error } = await supabase
        .from("products")
        .update({ show_in_catalog: true })
        .in("id", ids.slice(inicio, inicio + 200))
        .in("user_id", acesso.empresa.tenantIds)
        .eq("show_in_catalog", false)
        .select("id");
      if (error) throw error;
      publicados += data?.length ?? 0;
    }
    avisarLoja(acesso.empresa.ownerId ?? acesso.empresa.companyId, request);
    return NextResponse.json({ publicados }, { headers: { "Cache-Control": "no-store" } });
  } catch (erro) {
    console.error("[assistentes] não foi possível publicar a importação:", erro instanceof Error ? erro.message : erro);
    return NextResponse.json({ error: "Não foi possível publicar agora. Tente de novo." }, { status: 500 });
  }
}
