import { emitirDevolucao, notaParaDevolver } from "@/lib/fiscal/servidor/devolucao";
import { ErroFiscal } from "@/lib/fiscal/servidor/notas";
import { exigirUuid, lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

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

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

/** Os itens da nota, para escolher o que está voltando. */
export async function GET(_req: Request, { params }: Contexto) {
  const { id } = await params;
  return rotaFiscal("fiscal.emitir", async ({ admin, empresaId }) => {
    const nota = await notaParaDevolver(admin, { empresaId, notaId: exigirUuid(id, "Nota") });
    return { nota };
  });
}

/** Emite a nota de devolução, referenciando a venda item a item. */
export async function POST(req: Request, { params }: Contexto) {
  const { id } = await params;
  return rotaFiscal("fiscal.emitir", async ({ admin, empresaId, ambiente, user }) => {
    const corpo = await lerCorpo(req);
    const itens = Array.isArray(corpo.itens) ? corpo.itens : [];
    if (!itens.length) throw new ErroFiscal("Escolha o que está sendo devolvido.", 400);
    const nota = await emitirDevolucao(admin, {
      empresaId,
      ambiente,
      notaId: exigirUuid(id, "Nota"),
      itens: itens.map((item) => ({
        indice: Number((item as Record<string, unknown>).indice),
        quantidade: Number((item as Record<string, unknown>).quantidade),
      })),
      motivo: String(corpo.motivo ?? ""),
      usuarioId: user.id,
    });
    return { nota: { id: nota.id, status: nota.status, numero: nota.numero, mensagem: nota.mensagem } };
  });
}
