import { lerPreferencias } from "@/lib/fiscal/emissor";
import { carregarEmissor } from "@/lib/fiscal/servidor/base";
import {
  listarRecebidasGuardadas,
  marcarRecebidasComoVistas,
  mudarRecebimento,
  sincronizarNotasRecebidas,
  type FiltroDeRecebidas,
} from "@/lib/fiscal/servidor/recebidas";
import { lerCorpo, rotaFiscal } from "@/lib/fiscal/servidor/rota";

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

/** A lista de notas que outras empresas emitiram contra este CNPJ. */
export async function GET(req: Request) {
  return rotaFiscal(["fiscal.recebidas", "fiscal.ver"], async ({ admin, empresaId, ambiente, pode }) => {
    const busca = new URL(req.url).searchParams;
    const situacao = busca.get("situacao");
    const filtro: FiltroDeRecebidas = {
      situacao: situacao === "sem_resposta" || situacao === "respondidas" || situacao === "canceladas" ? situacao : "todas",
      busca: busca.get("q"),
    };
    const [emissor, notas] = await Promise.all([
      carregarEmissor(admin, empresaId, ambiente),
      listarRecebidasGuardadas(admin, { empresaId, ambiente, filtro }),
    ]);
    const preferencias = lerPreferencias(emissor?.preferencias);
    if (busca.get("marcarVistas") === "1") await marcarRecebidasComoVistas(admin, { empresaId, ambiente });
    return {
      notas,
      ligado: preferencias.receberNotas,
      desde: preferencias.receberDesde,
      configurada: Boolean(emissor?.spedy_empresa_id && emissor?.chave_cifrada),
      podeResponder: pode("fiscal.recebidas"),
      podeLigar: pode("fiscal.configurar"),
      ambiente,
    };
  });
}

/** Pede à SEFAZ, agora, as notas que chegaram. Respeita o limite dela. */
export async function POST(req: Request) {
  return rotaFiscal(["fiscal.recebidas", "fiscal.ver"], async ({ admin, empresaId, ambiente }) => {
    const corpo = await lerCorpo(req);
    const resultado = await sincronizarNotasRecebidas(admin, {
      empresaId,
      ambiente,
      pedirBusca: corpo.buscarAgora !== false,
    });
    const notas = await listarRecebidasGuardadas(admin, { empresaId, ambiente });
    return { ...resultado, notas };
  });
}

/** Liga ou desliga a busca automática das notas recebidas. */
export async function PUT(req: Request) {
  return rotaFiscal("fiscal.configurar", async ({ admin, empresaId, ambiente }) => {
    const corpo = await lerCorpo(req);
    const resultado = await mudarRecebimento(admin, {
      empresaId,
      ambiente,
      ligado: corpo.ligado === true,
      desde: typeof corpo.desde === "string" ? corpo.desde : null,
    });
    if (resultado.ligado) {
      /* Primeira busca logo depois de ligar, para a tela não nascer vazia. */
      await sincronizarNotasRecebidas(admin, { empresaId, ambiente, pedirBusca: true }).catch(() => null);
    }
    const notas = await listarRecebidasGuardadas(admin, { empresaId, ambiente });
    return { ...resultado, notas };
  });
}
