import { notaParaTela } from "@/lib/fiscal/servidor/apresentacao";
import { servidorPronto } from "@/lib/fiscal/servidor/base";
import { acordarFila } from "@/lib/fiscal/servidor/fila";
import { ErroFiscal } from "@/lib/fiscal/servidor/notas";
import { cupomAtualDaVenda, emitirCupomNoBalcao } from "@/lib/fiscal/servidor/pdv";
import { exigirUuid, lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

/** Como está o cupom fiscal da venda. Se ainda estiver a caminho, espera alguns segundos pela SEFAZ antes de responder. */
export async function GET(req: Request) {
  return rotaFiscal(["pdv.read", "fiscal.ver"], async ({ admin, empresaId, ambiente, pode }) => {
    const pedidoId = exigirUuid(new URL(req.url).searchParams.get("pedidoId"), "Pedido");
    const nota = await cupomAtualDaVenda(admin, { empresaId, ambiente, pedidoId, podeQualquerPedido: pode("fiscal.ver"), esperarMs: 5_000 });
    return { nota: nota ? notaParaTela(nota) : null };
  });
}

/**
 * O cupom fiscal da venda que acabou de fechar no PDV, na hora: emite e espera
 * a SEFAZ por alguns segundos. Responde com a nota (autorizada, recusada ou
 * ainda a caminho) ou com o motivo de ela não poder sair.
 */
export async function POST(req: Request) {
  return rotaFiscal(["pdv.read", "fiscal.emitir"], async ({ admin, empresaId, ambiente, user, pode }) => {
    const bloqueio = servidorPronto();
    if (bloqueio) throw new ErroFiscal(bloqueio, 503);
    const corpo = await lerCorpo(req);
    const pedidoId = exigirUuid(typeof corpo.pedidoId === "string" ? corpo.pedidoId : null, "Pedido");
    const cupom = await emitirCupomNoBalcao(admin, {
      empresaId,
      ambiente,
      pedidoId,
      usuarioId: user.id,
      documento: typeof corpo.documento === "string" ? corpo.documento : null,
      podeQualquerPedido: pode("fiscal.emitir"),
    });
    acordarFila();
    return {
      situacao: cupom.situacao,
      motivo: cupom.motivo,
      pendencias: cupom.pendencias,
      nota: cupom.nota ? notaParaTela(cupom.nota) : null,
    };
  });
}
