import { resolveCatalogAppearance } from "@/lib/catalog-appearance";
import type { BoutiqueAparencia } from "./BoutiqueShell";

/*
  As escolhas de aparência da loja, traduzidas para a Boutique.

  Mora num lugar só porque as quatro páginas do template (home, categoria,
  busca e produto) precisam exatamente do mesmo objeto — e porque uma opção
  esquecida numa delas aparece como "a personalização não funciona".

  Cor e fonte passam pela trava `catalog_advanced_enabled`, que é onde o
  sistema decide se a loja abriu a personalização avançada. Aviso, efeito de
  logo, nome no cabeçalho e tarja de benefícios não passam por ela: são
  configurações do catálogo comum, e valem sempre.

  Com a trava desligada a Boutique tem a cara da referência (preto e branco,
  acento caramelo): é por `avancadoLigado` que o shell sabe se a cor da marca
  entra como acento. As redes sociais e as cores da barra de compra também
  chegam por aqui, para nenhuma das cinco páginas precisar repassar coluna
  por coluna.
*/

type PerfilDaLoja = Record<string, unknown>;

function texto(valor: unknown) {
  const limpo = String(valor ?? "").trim();
  return limpo || null;
}

function numero(valor: unknown) {
  const n = Number(valor);
  return Number.isFinite(n) ? n : null;
}

export function aparenciaDaBoutique(perfil: PerfilDaLoja | null | undefined): BoutiqueAparencia {
  const p = (perfil || {}) as Record<string, unknown>;
  const avancado = resolveCatalogAppearance(p as never);

  const tarjaBruta = Array.isArray(p.catalog_info_strip_items) ? p.catalog_info_strip_items : [];

  return {
    avancadoLigado: avancado.enabled,
    corDoCabecalho: avancado.headerColor,
    corDoTextoDoCabecalho: avancado.headerTextColor,
    corDoMenu: avancado.menuColor,
    corDoTextoDoMenu: avancado.menuTextColor,
    corDoFundo: avancado.pageBgColor,
    corDoBotaoDoCard: avancado.cardButtonColor,
    fonteDosTitulos: avancado.fonts.heading,
    fonteDoTexto: avancado.fonts.body,
    /* A barra de compra fixa do celular (o uso fica na página de produto). */
    corDaBarraDeCompra: avancado.buyBar.bg,
    corDoBotaoDaBarraDeCompra: avancado.buyBar.button,
    corDoTextoDaBarraDeCompra: avancado.buyBar.text,

    /* Todas as redes que o cadastro da loja guarda, não só Instagram e
       Facebook. */
    redes: {
      instagram: texto(p.social_instagram),
      facebook: texto(p.social_facebook),
      twitter: texto(p.social_twitter),
      linkedin: texto(p.social_linkedin),
      youtube: texto(p.social_youtube),
    },

    corDoRodape: texto(p.catalog_footer_color),
    corDoTextoDoRodape: texto(p.catalog_footer_text_color),
    corDosIconesDoCabecalho: texto(p.catalog_header_icon_color),

    mostrarNome: p.catalog_show_name_in_header === true,
    mostrarSlogan: p.catalog_show_slogan_in_header === true,
    corDoNome: texto(p.catalog_name_color),
    corDoSlogan: texto(p.catalog_slogan_color),

    avisoLigado: p.catalog_announcement_enabled === true,
    avisoTexto: texto(p.catalog_announcement_text),
    avisoCorDeFundo: texto(p.catalog_announcement_background_color),
    avisoCorDoTexto: texto(p.catalog_announcement_text_color),
    avisoBotaoRotulo: texto(p.catalog_announcement_button_label),
    avisoBotaoUrl: texto(p.catalog_announcement_button_url),
    avisoMostrarSelo: p.catalog_announcement_show_coupon_badge !== false,
    avisoCorDoSelo: texto(p.catalog_announcement_coupon_badge_color),
    avisoContagemLigada: p.catalog_announcement_countdown_enabled === true,
    avisoContagemAte: texto(p.catalog_announcement_countdown_end_at),
    avisoFixo: p.catalog_announcement_sticky !== false,

    logoEfeitoLigado: p.catalog_logo_effect_enabled === true,
    logoEfeitoTipo: texto(p.catalog_logo_effect),
    logoEfeitoVelocidade: numero(p.catalog_logo_effect_speed),
    logoEfeitoIntensidade: numero(p.catalog_logo_effect_intensity),

    tarjaLigada: p.catalog_info_strip_enabled !== false,
    tarjaItens: (tarjaBruta as Array<Record<string, unknown>>)
      .map((item) => ({
        icon: texto(item?.icon),
        title: texto(item?.title),
        subtitle: texto(item?.subtitle),
      }))
      .filter((item) => item.title || item.subtitle),
  };
}
