/**
 * Qual é a plataforma da loja antiga, pelas marcas que ela deixa no HTML e
 * nos cabeçalhos. Decide o caminho da leitura: Shopify, WooCommerce e VTEX
 * entregam o catálogo inteiro em dados; as outras são lidas página a página.
 */

export type Plataforma = "shopify" | "woocommerce" | "vtex" | "nuvemshop" | "lojaintegrada" | "tray" | "wix" | "magento" | "wordpress" | "outra";

export const NOME_DA_PLATAFORMA: Record<Plataforma, string> = {
  shopify: "Shopify",
  woocommerce: "WooCommerce (WordPress)",
  vtex: "VTEX",
  nuvemshop: "Nuvemshop",
  lojaintegrada: "Loja Integrada",
  tray: "Tray",
  wix: "Wix",
  magento: "Magento",
  wordpress: "WordPress",
  outra: "site próprio",
};

/* As marcas fortes vêm antes: loja de uma plataforma às vezes carrega uma
   foto ou um app hospedado em outra (achamos Nuvemshop com link para o
   cdn.shopify.com), e a marca fraca só decide quando nenhuma forte apareceu. */
const MARCAS: Array<[Plataforma, RegExp]> = [
  ["nuvemshop", /mitiendanube\.com|nuvemshop|tiendanube|\bLS\.store\b/i],
  ["vtex", /vteximg\.com\.br|vtexassets\.com|vtex\.js|vtex-render|"vtex\./i],
  ["shopify", /window\.Shopify\b|Shopify\.shop\s*=|Shopify\.theme\s*=|shopify-section/i],
  ["woocommerce", /woocommerce|wc-block|wp-content\/plugins\/woocommerce/i],
  ["lojaintegrada", /lojaintegrada|awsli\.com\.br/i],
  ["tray", /tcdn\.com\.br|tray\.com\.br|traycorp/i],
  ["wix", /wixstatic\.com|static\.parastorage\.com|wix-code/i],
  ["magento", /Magento_|mage\/cookies|static\/version\d+\/frontend/i],
  ["shopify", /cdn\.shopify\.com/i],
  ["wordpress", /wp-content\/|wp-json/i],
];

export function detectarPlataforma(html: string, cabecalhos: Record<string, string> = {}): Plataforma {
  if (cabecalhos["x-shopid"] || cabecalhos["x-shopify-stage"] || /shopify/i.test(cabecalhos["powered-by"] ?? "")) return "shopify";
  if (Object.keys(cabecalhos).some((nome) => nome.startsWith("x-vtex"))) return "vtex";
  for (const [plataforma, marca] of MARCAS) {
    if (marca.test(html)) return plataforma;
  }
  return "outra";
}
