import {
  inutilizarFaixa,
  listarInutilizacoesGuardadas,
  seriesDaEmpresa,
  type ModeloComNumeracao,
} from "@/lib/fiscal/servidor/inutilizacao";
import { ErroFiscal } from "@/lib/fiscal/servidor/notas";
import { lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

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

/** O histórico de faixas inutilizadas e as séries em uso. */
export async function GET() {
  return rotaFiscal(["fiscal.cancelar", "fiscal.ver"], async ({ admin, empresaId, ambiente, pode }) => {
    const [inutilizacoes, series] = await Promise.all([
      listarInutilizacoesGuardadas(admin, empresaId, ambiente),
      seriesDaEmpresa(admin, empresaId, ambiente),
    ]);
    return { inutilizacoes, series, podeInutilizar: pode("fiscal.cancelar") };
  });
}

/** Inutiliza uma faixa de números que nunca virou nota. Não tem volta. */
export async function POST(req: Request) {
  return rotaFiscal("fiscal.cancelar", async ({ admin, empresaId, ambiente, user }) => {
    const corpo = await lerCorpo(req);
    const modelo: ModeloComNumeracao = corpo.modelo === "nfce" ? "nfce" : "nfe";
    const de = Number(corpo.de);
    const ate = Number(corpo.ate);
    if (!Number.isFinite(de) || !Number.isFinite(ate)) throw new ErroFiscal("Informe a faixa de números.", 400);
    const inutilizacao = await inutilizarFaixa(admin, {
      empresaId,
      ambiente,
      modelo,
      serie: String(corpo.serie ?? ""),
      de,
      ate,
      motivo: String(corpo.motivo ?? ""),
      usuarioId: user.id,
    });
    return { inutilizacao };
  });
}
