import { ErroFiscal } from "@/lib/fiscal/servidor/notas";
import { conferirRecebida, responderRecebida, type TipoDeManifestacao } from "@/lib/fiscal/servidor/recebidas";
import { exigirUuid, lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

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

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

const TIPOS: TipoDeManifestacao[] = ["ciencia", "confirmada", "desconhecida", "nao_realizada"];

/** A nota recebida como está agora na SEFAZ (usado depois de responder). */
export async function GET(_req: Request, { params }: Contexto) {
  const { id } = await params;
  return rotaFiscal(["fiscal.recebidas", "fiscal.ver"], async ({ admin, empresaId, ambiente }) => {
    const nota = await conferirRecebida(admin, { empresaId, ambiente, notaId: exigirUuid(id, "Nota recebida") });
    return { nota };
  });
}

/** A resposta ao emissor: ciência, confirmação, desconhecimento ou não realizada. */
export async function POST(req: Request, { params }: Contexto) {
  const { id } = await params;
  return rotaFiscal("fiscal.recebidas", async ({ admin, empresaId, ambiente, user }) => {
    const corpo = await lerCorpo(req);
    const tipo = TIPOS.find((t) => t === corpo.resposta);
    if (!tipo) throw new ErroFiscal("Escolha o que responder à nota.", 400);
    const nota = await responderRecebida(admin, {
      empresaId,
      ambiente,
      notaId: exigirUuid(id, "Nota recebida"),
      tipo,
      motivo: typeof corpo.motivo === "string" ? corpo.motivo : null,
      usuarioId: user.id,
    });
    return { nota };
  });
}
