/*
  Do banco ao PDF, numa chamada só: carrega a loja, monta as páginas, põe as
  fotos dentro e imprime. É o que a fila roda, e o que o teste roda direto
  para comparar com o protótipo aprovado.
*/

import type { SupabaseClient } from "@supabase/supabase-js";
import { montarCatalogo } from "../modelo.ts";
import type { OpcoesDoCatalogo } from "../opcoes.ts";
import { carregarLoja } from "./carregar.ts";
import { imprimir } from "./imprimir.ts";

export type EtapaDoCatalogo = "fila" | "loja" | "fotos" | "paginas" | "pdf" | "pronto" | "erro";

export type CatalogoGerado = {
  pdf: Buffer;
  html: string;
  paginas: number;
  miniaturas: string[];
  nomeDoArquivo: string;
};

/* "Catálogo Gráfica Aurora.pdf": é o nome que o cliente vê no WhatsApp. */
export function nomeDoArquivo(nomeDaLoja: string) {
  const limpo = Array.from(String(nomeDaLoja || ""))
    .filter((letra) => letra.charCodeAt(0) >= 32 && !'\\/:*?"<>|'.includes(letra))
    .join("")
    .replace(/\s+/g, " ")
    .trim()
    .slice(0, 70)
    .trim();
  return `Catálogo ${limpo || "da loja"}.pdf`;
}

/* A capa, a segunda e a terceira página e a contracapa: o bastante para ver
   como ficou, sem repetir página em catálogo curto. */
export function paginasDaMiniatura(total: number) {
  return [...new Set([0, 1, 2, total - 1])].filter((indice) => indice >= 0 && indice < total).sort((a, b) => a - b);
}

export async function gerarCatalogo(params: {
  admin: SupabaseClient;
  donoId: string;
  origemPublica: string;
  opcoes: OpcoesDoCatalogo;
  agora?: Date;
  aoProgredir?: (etapa: EtapaDoCatalogo, feito: number, total: number) => void;
}): Promise<CatalogoGerado> {
  const { opcoes, aoProgredir } = params;
  const { loja, fotos } = await carregarLoja({
    admin: params.admin,
    donoId: params.donoId,
    origemPublica: params.origemPublica,
    opcoes,
    agora: params.agora,
    aoProgredir: (etapa, feito, total) => aoProgredir?.(etapa, feito, total),
  });
  aoProgredir?.("paginas", 0, 1);
  /* Sem WhatsApp cadastrado, "Pedir no WhatsApp" vira "Comprar" na loja. */
  const escolhas: OpcoesDoCatalogo = !loja.whatsapp && opcoes.botao === "whatsapp" ? { ...opcoes, botao: "loja" } : opcoes;
  const montado = montarCatalogo(loja, escolhas);
  const html = await fotos.embutir(montado.html, (feitas, total) => aoProgredir?.("paginas", feitas, total));
  aoProgredir?.("pdf", 0, montado.paginas);
  const impresso = await imprimir(html, opcoes.formato, paginasDaMiniatura);
  aoProgredir?.("pdf", impresso.paginas, impresso.paginas);
  return {
    pdf: impresso.pdf,
    html,
    paginas: impresso.paginas,
    miniaturas: impresso.miniaturas,
    nomeDoArquivo: nomeDoArquivo(loja.nome),
  };
}
