import { notaParaTela } from "@/lib/fiscal/servidor/apresentacao";
import { reenviarNotaAvulsa } from "@/lib/fiscal/servidor/avulsa";
import { servidorPronto } from "@/lib/fiscal/servidor/base";
import { acordarFila } from "@/lib/fiscal/servidor/fila";
import { enviarNota, ErroFiscal, notaDaEmpresa, reenviarNotaDoPedido } from "@/lib/fiscal/servidor/notas";
import { exigirUuid, lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

export const runtime = "nodejs";

type Contexto = { params: Promise<{ id: string }> };

/**
 * Reenvia uma nota rejeitada (depois de corrigir o cadastro) ou emite uma prévia.
 * Nota de pedido é remontada com os dados de agora: é assim que a correção do
 * cliente ou do produto entra na nota.
 */
export async function POST(req: Request, { params }: Contexto) {
  const { id } = await params;
  return rotaFiscal("fiscal.emitir", async ({ admin, empresaId, ambiente, user, ctx }) => {
    const bloqueio = servidorPronto();
    if (bloqueio) throw new ErroFiscal(bloqueio, 503);
    const notaId = exigirUuid(id, "Nota");
    const corpo = await lerCorpo(req);
    const atual = await notaDaEmpresa(admin, empresaId, notaId);
    const nota =
      atual.origem === "teste"
        ? await enviarNota(admin, notaId, { emitir: true, ator: user.id })
        : atual.origem === "avulsa"
          ? await reenviarNotaAvulsa(admin, { empresaId, tenantIds: ctx.tenantIds, ambiente, notaId, usuarioId: user.id })
          : await reenviarNotaDoPedido(admin, {
              empresaId,
              ambiente,
              notaId,
              usuarioId: user.id,
              escolhas: corpo.escolhas && typeof corpo.escolhas === "object" ? (corpo.escolhas as Record<string, never>) : undefined,
            });
    acordarFila();
    return { nota: notaParaTela(nota) };
  });
}
