/*
  Quantas páginas o catálogo vai ter, antes de gerar.

  As mesmas regras de `montarCatalogo` (modelo.ts), só que contando: capa;
  índice com 3 categorias ou mais; categoria grande com página de abertura
  (celular) e as suas páginas; as pequenas dividindo página; contracapa.
  O teste confere esta conta contra o modelo, para as duas nunca divergirem.
*/

import { emDestaque, type OpcoesDoCatalogo } from "./opcoes.ts";

export function contarPaginas(tamanhos: number[], opcoes: Pick<OpcoesDoCatalogo, "formato" | "layout" | "indice" | "divisores">) {
  const destaque = emDestaque(opcoes);
  const porPagina = opcoes.formato === "a4" ? 6 : destaque ? 1 : 4;
  const categorias = tamanhos.filter((n) => n > 0);
  if (!categorias.length) return 0;
  let paginas = 1;
  if (opcoes.indice && categorias.length >= 3) paginas += 1;
  let fila = 0;
  const despejar = () => {
    paginas += Math.ceil(fila / porPagina);
    fila = 0;
  };
  for (const n of categorias) {
    if (!destaque && n < porPagina) {
      fila += n;
      continue;
    }
    despejar();
    if (opcoes.divisores && opcoes.formato === "celular" && n > (destaque ? 2 : porPagina)) paginas += 1;
    paginas += Math.ceil(n / porPagina);
  }
  despejar();
  return paginas + 1;
}
