/*
 * Os tamanhos prontos do editor de artes (como "Criar um design" do Canva).
 * Em pixels; os de impressão levam a resolução (`dpi`) que dá a medida real
 * (cartão e convite em 300 ppp, folhas em 150, banner de lona em 72, faixa
 * grande em 50: o que a gráfica pede para cada um). O download em "Máxima"
 * (3×) ainda multiplica.
 */

export type GrupoDoFormato = "loja" | "redes" | "impressao" | "anuncios";

/* `dpi`: só nos de impressão (a medida em mm sai de largura ÷ dpi × 25,4). */
export type FormatoDaArte = { chave: string; nome: string; detalhe: string; largura: number; altura: number; grupo: GrupoDoFormato; dpi?: number };

export const GRUPOS_DOS_FORMATOS: Record<GrupoDoFormato, string> = {
  loja: "Loja",
  redes: "Redes sociais",
  anuncios: "Anúncios e vídeo",
  impressao: "Impressão",
};

export const FORMATOS_DA_ARTE: FormatoDaArte[] = [
  { chave: "banner-loja", nome: "Banner da loja", detalhe: "Carrossel do topo", largura: 1920, altura: 540, grupo: "loja" },
  { chave: "banner-meio", nome: "Banner do meio", detalhe: "Seção de banner", largura: 1600, altura: 600, grupo: "loja" },
  { chave: "banner-celular", nome: "Banner do celular", detalhe: "Em pé, para o celular", largura: 1080, altura: 1350, grupo: "loja" },
  { chave: "post", nome: "Post quadrado", detalhe: "Instagram e Facebook", largura: 1080, altura: 1080, grupo: "redes" },
  { chave: "post-retrato", nome: "Post retrato", detalhe: "Instagram 4:5", largura: 1080, altura: 1350, grupo: "redes" },
  { chave: "story", nome: "Story e Reels", detalhe: "Instagram, WhatsApp, TikTok", largura: 1080, altura: 1920, grupo: "redes" },
  { chave: "capa-facebook", nome: "Capa do Facebook", detalhe: "Página da empresa", largura: 1640, altura: 624, grupo: "redes" },
  { chave: "destaque", nome: "Capa de destaque", detalhe: "Bolinha do Instagram", largura: 1080, altura: 1080, grupo: "redes" },
  { chave: "youtube", nome: "Miniatura do YouTube", detalhe: "16:9", largura: 1280, altura: 720, grupo: "anuncios" },
  { chave: "anuncio-paisagem", nome: "Anúncio paisagem", detalhe: "Google e Meta", largura: 1200, altura: 628, grupo: "anuncios" },
  { chave: "a4", nome: "Folha A4", detalhe: "Cartaz, cardápio, folheto", largura: 1240, altura: 1754, grupo: "impressao", dpi: 150 },
  /* Deitada e em 300 ppp: a folha dos calendários de 5 × 5 cm (letra miúda das datas e das luas). */
  { chave: "a4-deitada", nome: "Folha A4 deitada", detalhe: "Calendário, 29,7 × 21 cm", largura: 3508, altura: 2480, grupo: "impressao", dpi: 300 },
  { chave: "a5", nome: "Flyer A5", detalhe: "Panfleto", largura: 874, altura: 1240, grupo: "impressao", dpi: 150 },
  { chave: "a3", nome: "Cartaz A3", detalhe: "Cartaz grande", largura: 1754, altura: 2480, grupo: "impressao", dpi: 150 },
  { chave: "cartao", nome: "Cartão de visita", detalhe: "9 × 5 cm", largura: 1063, altura: 591, grupo: "impressao", dpi: 300 },
  { chave: "etiqueta", nome: "Etiqueta quadrada", detalhe: "Adesivo, tag", largura: 1000, altura: 1000, grupo: "impressao", dpi: 300 },
  { chave: "adesivo-5", nome: "Adesivo redondo", detalhe: "5 cm", largura: 591, altura: 591, grupo: "impressao", dpi: 300 },
  { chave: "tag", nome: "Tag de roupa", detalhe: "5 × 9 cm", largura: 591, altura: 1063, grupo: "impressao", dpi: 300 },
  { chave: "convite", nome: "Convite", detalhe: "10 × 15 cm", largura: 1181, altura: 1772, grupo: "impressao", dpi: 300 },
  /* A área de estampa da caneca de porcelana de 325 ml (11 oz), a mais vendida na sublimação: dá a volta toda, menos a alça. */
  { chave: "caneca", nome: "Caneca 325 ml", detalhe: "Sublimação, 20 × 9,5 cm", largura: 2362, altura: 1122, grupo: "impressao", dpi: 300 },
  { chave: "banner-60x90", nome: "Banner em lona", detalhe: "60 × 90 cm", largura: 1701, altura: 2551, grupo: "impressao", dpi: 72 },
  { chave: "banner-80x120", nome: "Banner em lona", detalhe: "80 × 120 cm", largura: 2268, altura: 3402, grupo: "impressao", dpi: 72 },
  { chave: "faixa-300x70", nome: "Faixa", detalhe: "3 × 0,7 m", largura: 5906, altura: 1378, grupo: "impressao", dpi: 50 },
];

/** Pixels em milímetros na resolução da arte (e o contrário). */
export const mmDe = (px: number, dpi: number) => (px / dpi) * 25.4;
export const pxDe = (mm: number, dpi: number) => Math.round((mm / 25.4) * dpi);

/** A medida bonita: "9 × 5 cm", "20 × 9,5 cm", "297 × 420 mm" ou "3 × 0,7 m". */
export function medidaDeImpressao(largura: number, altura: number, dpi: number) {
  const [w, h] = [mmDe(largura, dpi), mmDe(altura, dpi)];
  const numero = (v: number) => v.toLocaleString("pt-BR", { maximumFractionDigits: 1 });
  if (Math.max(w, h) >= 1000) return `${numero(w / 1000)} × ${numero(h / 1000)} m`;
  /* Em centímetros quando os dois lados dão cm redondos ou meio cm (9 × 5 cm, 20 × 9,5 cm). */
  const meioCm = (v: number) => Math.round(v / 5) / 2;
  if (Math.abs(w / 10 - meioCm(w)) < 0.06 && Math.abs(h / 10 - meioCm(h)) < 0.06) return `${numero(meioCm(w))} × ${numero(meioCm(h))} cm`;
  return `${Math.round(w)} × ${Math.round(h)} mm`;
}

export const LIMITE_DO_LADO = 6000;
export const MINIMO_DO_LADO = 50;

export function formatoDaChave(chave: string | null | undefined) {
  return FORMATOS_DA_ARTE.find((f) => f.chave === chave) || null;
}

/** O formato que tem exatamente esse tamanho (para dar nome à arte). */
export function formatoDoTamanho(largura: number, altura: number) {
  return FORMATOS_DA_ARTE.find((f) => f.largura === largura && f.altura === altura) || null;
}

/*
 * Caneca: a arte do tamanho da área de estampa (2:1 a 2,3:1, de impressão).
 * Enrolada, as duas pontas encostam na alça e o meio fica do lado oposto.
 * Olhando a caneca com a alça à esquerda, aparece a metade esquerda da arte
 * (centro em 1/4); com a alça à direita, a metade direita (centro em 3/4).
 */
export function ehCaneca(doc: { largura: number; altura: number; impressao?: { dpi: number } | null } | null | undefined) {
  if (!doc?.impressao) return false;
  const r = doc.largura / doc.altura;
  return r >= 1.95 && r <= 2.35;
}
