/*
 * O certificado de conclusão: o código que qualquer pessoa confere no
 * endereço da loja e os textos que a folha e o PDF usam (o PDF é montado só
 * no servidor, em servidor/pdf-do-certificado.ts).
 */

/* Sem letras que se confundem (0/O, 1/I/L). */
const ALFABETO = "ABCDEFGHJKMNPQRSTUVWXYZ23456789";

/* As três letras da loja: "Escola Aurora" → "ESC"; sem letras, "CRT". */
export function prefixoDoCertificado(nomeDaLoja: string): string {
  const letras = nomeDaLoja
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .toUpperCase()
    .replace(/[^A-Z]/g, "");
  return letras.length >= 2 ? letras.slice(0, 3) : "CRT";
}

/* "AUR-2026-7K2M-Q9FX": a loja, o ano e 8 letras sorteadas. */
export function novoCodigoDoCertificado(nomeDaLoja: string, ano: number, sorteio: Uint8Array = crypto.getRandomValues(new Uint8Array(8))): string {
  const letras = Array.from(sorteio.slice(0, 8), (n) => ALFABETO[n % ALFABETO.length]).join("");
  return `${prefixoDoCertificado(nomeDaLoja)}-${ano}-${letras.slice(0, 4)}-${letras.slice(4, 8)}`;
}

/* O código digitado por alguém: maiúsculas, sem espaços; null quando não parece um. */
export function codigoDigitado(valor: string): string | null {
  const limpo = String(valor || "").trim().toUpperCase().replace(/\s+/g, "");
  return /^[A-Z0-9-]{8,40}$/.test(limpo) ? limpo : null;
}

/* As letras que a fonte do PDF conhece (o resto sai do texto, sem quebrar o arquivo). */
const EXTRAS_DO_WIN_ANSI = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ";
export function paraWinAnsi(texto: string): string {
  return Array.from(String(texto || "").normalize("NFC"))
    .filter((letra) => {
      const codigo = letra.codePointAt(0) ?? 0;
      return (codigo >= 0x20 && codigo <= 0x7e) || (codigo >= 0xa0 && codigo <= 0xff) || EXTRAS_DO_WIN_ANSI.includes(letra);
    })
    .join("")
    .replace(/\s+/g, " ")
    .trim();
}

/* "10 de outubro de 2026" no horário de Brasília. */
export function dataPorExtenso(iso: string): string {
  try {
    return new Intl.DateTimeFormat("pt-BR", { day: "numeric", month: "long", year: "numeric", timeZone: "America/Sao_Paulo" }).format(new Date(iso));
  } catch {
    return iso.slice(0, 10);
  }
}

/* O código de exemplo da página de venda ("AUR-2026-XXXX-XXXX"). */
export function codigoDeExemplo(nomeDaLoja: string, agora = new Date()): string {
  return `${prefixoDoCertificado(nomeDaLoja)}-${agora.getFullYear()}-XXXX-XXXX`;
}

/* O que a página de venda mostra do certificado do curso. */
export type CertificadoNaVenda = { loja: string; logo: string | null; cargaHoraria: string; codigo: string };
