/**
 * Fontes que o lojista pode escolher na personalizacao avancada.
 *
 * ESTE ARQUIVO E GERADO por scripts/gen_fonts.py, junto com o do admin, para
 * as CHAVES (gravadas em `catalog_font_heading` e `catalog_font_body`) nunca
 * divergirem entre o seletor e a vitrine. Nunca renomeie uma chave sem migrar
 * os dados: a loja que a usava cairia no padrao silenciosamente.
 *
 * A vitrine nao instancia fonte com next/font: isso punha 112 KB de CSS
 * bloqueante em toda loja para usar duas familias. Aqui vai so a tabela, e a
 * loja pede ao Google Fonts a dupla escolhida (ver components/FontesDaLoja).
 */

type FonteDaLoja = { familia: string; pesos: string[]; generico: string };

const FONTES: Record<string, FonteDaLoja> = {
  "fraunces": { familia: "Fraunces", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "playfair-display": { familia: "Playfair Display", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "instrument-serif": { familia: "Instrument Serif", pesos: ["400"], generico: "serif" },
  "lora": { familia: "Lora", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "eb-garamond": { familia: "EB Garamond", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "cormorant-garamond": { familia: "Cormorant Garamond", pesos: ["300", "400", "500", "600", "700"], generico: "serif" },
  "libre-baskerville": { familia: "Libre Baskerville", pesos: ["400", "700"], generico: "serif" },
  "crimson-pro": { familia: "Crimson Pro", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "merriweather": { familia: "Merriweather", pesos: ["300", "400", "700", "900"], generico: "serif" },
  "source-serif-4": { familia: "Source Serif 4", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "spectral": { familia: "Spectral", pesos: ["200", "300", "400", "500", "600", "700", "800"], generico: "serif" },
  "newsreader": { familia: "Newsreader", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "literata": { familia: "Literata", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "dm-serif-display": { familia: "DM Serif Display", pesos: ["400"], generico: "serif" },
  "bodoni-moda": { familia: "Bodoni Moda", pesos: ["400", "500", "600", "700"], generico: "serif" },
  "marcellus": { familia: "Marcellus", pesos: ["400"], generico: "serif" },
  "syne": { familia: "Syne", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "unbounded": { familia: "Unbounded", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "anton": { familia: "Anton", pesos: ["400"], generico: "sans-serif" },
  "bebas-neue": { familia: "Bebas Neue", pesos: ["400"], generico: "sans-serif" },
  "archivo-black": { familia: "Archivo Black", pesos: ["400"], generico: "sans-serif" },
  "abril-fatface": { familia: "Abril Fatface", pesos: ["400"], generico: "sans-serif" },
  "alfa-slab-one": { familia: "Alfa Slab One", pesos: ["400"], generico: "sans-serif" },
  "righteous": { familia: "Righteous", pesos: ["400"], generico: "sans-serif" },
  "darker-grotesque": { familia: "Darker Grotesque", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "bricolage-grotesque": { familia: "Bricolage Grotesque", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "space-grotesk": { familia: "Space Grotesk", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "sora": { familia: "Sora", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "manrope": { familia: "Manrope", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "dm-sans": { familia: "DM Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "outfit": { familia: "Outfit", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "figtree": { familia: "Figtree", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "epilogue": { familia: "Epilogue", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "work-sans": { familia: "Work Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "inter": { familia: "Inter", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "plus-jakarta-sans": { familia: "Plus Jakarta Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "urbanist": { familia: "Urbanist", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "jost": { familia: "Jost", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "lexend": { familia: "Lexend", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "albert-sans": { familia: "Albert Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "onest": { familia: "Onest", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "schibsted-grotesk": { familia: "Schibsted Grotesk", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "hanken-grotesk": { familia: "Hanken Grotesk", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "archivo": { familia: "Archivo", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "poppins": { familia: "Poppins", pesos: ["300", "400", "500", "600", "700"], generico: "sans-serif" },
  "montserrat": { familia: "Montserrat", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "raleway": { familia: "Raleway", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "nunito": { familia: "Nunito", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "nunito-sans": { familia: "Nunito Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "rubik": { familia: "Rubik", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "karla": { familia: "Karla", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "lato": { familia: "Lato", pesos: ["300", "400", "700", "900"], generico: "sans-serif" },
  "open-sans": { familia: "Open Sans", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "roboto": { familia: "Roboto", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "source-sans-3": { familia: "Source Sans 3", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "quicksand": { familia: "Quicksand", pesos: ["400", "500", "600", "700"], generico: "sans-serif" },
  "jetbrains-mono": { familia: "JetBrains Mono", pesos: ["400", "500", "600", "700"], generico: "monospace" },
  "ibm-plex-mono": { familia: "IBM Plex Mono", pesos: ["300", "400", "500", "600", "700"], generico: "monospace" },
  "space-mono": { familia: "Space Mono", pesos: ["400", "700"], generico: "monospace" },
  "roboto-mono": { familia: "Roboto Mono", pesos: ["400", "500", "600", "700"], generico: "monospace" },
  "caveat": { familia: "Caveat", pesos: ["400", "500", "600", "700"], generico: "cursive" },
  "dancing-script": { familia: "Dancing Script", pesos: ["400", "500", "600", "700"], generico: "cursive" },
  "pacifico": { familia: "Pacifico", pesos: ["400"], generico: "cursive" },
  "sacramento": { familia: "Sacramento", pesos: ["400"], generico: "cursive" },
  "great-vibes": { familia: "Great Vibes", pesos: ["400"], generico: "cursive" },
};

function fonte(chave: string | null | undefined) {
  const limpa = String(chave || "").trim();
  if (!limpa) return null;
  return FONTES[limpa] || null;
}

export function resolveCatalogFontFamily(chave: string | null | undefined) {
  const f = fonte(chave);
  if (!f) return null;
  return `"${f.familia}", ${f.generico}`;
}

/** A URL do CSS do Google Fonts com as familias pedidas, ou nulo se nenhuma. */
export function hrefDasFontes(chaves: Array<string | null | undefined>) {
  const vistas = new Set<string>();
  const partes: string[] = [];
  for (const chave of chaves) {
    const f = fonte(chave);
    if (!f || vistas.has(f.familia)) continue;
    vistas.add(f.familia);
    partes.push(`family=${encodeURIComponent(f.familia).replace(/%20/g, "+")}:wght@${f.pesos.join(";")}`);
  }
  if (!partes.length) return null;
  return `https://fonts.googleapis.com/css2?${partes.join("&")}&display=swap`;
}

/**
 * Resolve o par de fontes da loja.
 *
 * Quando a personalizacao avancada esta desligada devolve nulo nos dois, e a
 * vitrine nao aplica nenhum estilo de fonte — a loja fica exatamente como era.
 */
export function resolveCatalogFonts(params: {
  enabled: boolean;
  heading?: string | null;
  body?: string | null;
}) {
  if (!params.enabled) return { heading: null, body: null };
  return {
    heading: resolveCatalogFontFamily(params.heading),
    body: resolveCatalogFontFamily(params.body),
  };
}
