/* ============================================================
   data.jsx — STEPS config + strategic recommendation logic
   ============================================================ */

const STEPS = [
  /* 0 — INTRO handled specially in App */
  { id: "intro", kind: "intro" },

  /* 1 — Empresa */
  {
    id: "empresa",
    eyebrow: "Bloco 01 — Identidade",
    title: "Pra começar, quem é a empresa?",
    sub: "Os dados básicos pra gente abrir seu dossiê e saber com quem está falando.",
    required: ["nome_empresa"],
    fields: [
      { id: "nome_empresa", type: "text", label: "Nome da empresa", placeholder: "Ex.: Studio Aurora" },
      { id: "site", type: "text", label: "Site", opt: true, placeholder: "www.suaempresa.com.br" },
      { id: "instagram", type: "text", label: "Instagram", opt: true, placeholder: "@seuperfil" },
      { id: "cidade", type: "text", label: "Cidade / área de atuação", placeholder: "São Paulo, SP" },
      { id: "responsavel", type: "text", label: "Responsável pelo projeto", placeholder: "Seu nome" },
      { id: "contato", type: "text", label: "Melhor contato (WhatsApp)", opt: true, placeholder: "(11) 9 0000-0000" },
    ],
  },

  /* 2 — Objetivo */
  {
    id: "objetivo",
    eyebrow: "Bloco 02 — Objetivo",
    title: "O que essa campanha precisa gerar?",
    sub: "Marque tudo que importa — depois a gente prioriza o principal.",
    required: ["objetivo"],
    fields: [
      { id: "objetivo", type: "chips", label: "Objetivos", options: [
        "Gerar leads", "Conversas no WhatsApp", "Agendamentos", "Venda direta / e-commerce",
        "Tráfego pra página", "Mais seguidores", "Reconhecimento de marca", "Remarketing",
      ] },
      { id: "meta_num", type: "text", opt: true, label: "Quanto seria um ótimo resultado por mês?", placeholder: "Ex.: 40 leads qualificados / 15 vendas" },
    ],
  },

  /* 3 — Oferta */
  {
    id: "oferta",
    eyebrow: "Bloco 03 — Oferta",
    title: "O que você vende?",
    sub: "Entender a oferta e o ticket muda totalmente a estratégia de mídia.",
    fields: [
      { id: "produto", type: "textarea", label: "Produto ou serviço principal", placeholder: "Descreva em poucas linhas o carro-chefe do negócio." },
      { id: "ticket", type: "money", label: "Ticket médio", min: 0, max: 20000, step: 50, placeholder: "Valor médio da sua venda" },
      { id: "pagamento", type: "chips", label: "Formas de pagamento", options: [
        "Pix / à vista", "Cartão", "Parcelado", "Boleto", "Assinatura / recorrência",
      ] },
      { id: "regioes", type: "text", label: "Regiões atendidas", placeholder: "Brasil todo, só capital, raio de X km..." },
      { id: "prioridade", type: "text", label: "Qual priorizar primeiro?", placeholder: "O que precisa vender mais agora" },
    ],
  },

  /* 4 — Público */
  {
    id: "publico",
    eyebrow: "Bloco 04 — Público",
    title: "Pra quem a gente vai falar?",
    sub: "Quanto mais nítido o público ideal, mais barato sai o resultado.",
    required: ["cliente_ideal"],
    fields: [
      { id: "cliente_ideal", type: "textarea", label: "Quem é o cliente ideal?", placeholder: "Perfil, momento de vida, o que ele busca..." },
      { id: "idade", type: "chips", opt: true, label: "Faixa etária", options: ["18–24", "25–34", "35–44", "45–54", "55+"] },
      { id: "renda", type: "choice", opt: true, label: "Perfil de renda", options: [
        { v: "Popular / classe C-D", k: "c" }, { v: "Classe média / B-C", k: "b" },
        { v: "Alto poder / A-B", k: "a" }, { v: "Premium / luxo", k: "lux" },
      ] },
      { id: "dores", type: "textarea", opt: true, label: "Principais dores e desejos", placeholder: "O que tira o sono do seu cliente?" },
      { id: "objecoes", type: "text", opt: true, label: "Objeções mais comuns", placeholder: "Preço, confiança, prazo..." },
      { id: "nao_atrair", type: "text", opt: true, label: "Quem NÃO deve ser atraído?", placeholder: "Curiosos, fora da região, sem orçamento..." },
    ],
  },

  /* 5 — Diferenciais */
  {
    id: "diferenciais",
    eyebrow: "Bloco 05 — Diferenciais",
    title: "Por que escolher você, e não o concorrente?",
    sub: "É daqui que saem os ângulos de criativo mais fortes.",
    required: ["diferenciais"],
    fields: [
      { id: "diferenciais", type: "textarea", label: "Principais diferenciais e a sua promessa", placeholder: "O que só você entrega? Qual a transformação?" },
      { id: "provas", type: "chips", opt: true, label: "Que provas você já tem?", options: [
        "Depoimentos", "Cases de sucesso", "Antes e depois", "Resultados em números",
        "Autoridade / mídia", "Certificações", "Avaliações 5★",
      ] },
      { id: "garantia", type: "text", opt: true, label: "Tem alguma garantia?", placeholder: "Ex.: satisfação ou seu dinheiro de volta" },
    ],
  },

  /* 6 — Funil */
  {
    id: "funil",
    eyebrow: "Bloco 06 — Funil comercial",
    title: "Pra onde o lead vai depois do clique?",
    sub: "Anúncio bom com atendimento lento queima verba. A gente alinha os dois.",
    required: ["destino"],
    fields: [
      { id: "destino", type: "chips", label: "Destino do lead", options: [
        "WhatsApp", "Landing page", "Formulário", "Ligação", "Direct", "CRM",
      ] },
      { id: "quem_atende", type: "text", opt: true, label: "Quem atende os leads?", placeholder: "Você, equipe de vendas, SDR..." },
      { id: "tempo_resposta", type: "choice", opt: true, label: "Tempo médio de resposta", options: [
        { v: "Na hora", k: "fast" }, { v: "Em até 1h", k: "ok" },
        { v: "Algumas horas", k: "slow" }, { v: "No mesmo dia", k: "slow" }, { v: "Mais de 1 dia", k: "vslow" },
      ] },
      { id: "follow_up", type: "choice", opt: true, label: "Existe follow-up de quem não fechou?", options: [
        { v: "Sim, estruturado", k: "yes" }, { v: "Sim, mas informal", k: "soft" }, { v: "Não tem", k: "no" },
      ] },
    ],
  },

  /* 7 — Histórico */
  {
    id: "historico",
    eyebrow: "Bloco 07 — Histórico",
    title: "Já rodou tráfego pago antes?",
    sub: "Aprendizados passados encurtam o caminho — inclusive os erros.",
    fields: [
      { id: "ja_anunciou", type: "choice", label: "Já anunciou?", options: [
        { v: "Sim, já rodei campanhas", k: "yes" }, { v: "Só impulsionei posts", k: "boost" }, { v: "Nunca anunciei", k: "no" },
      ] },
      { id: "canais_usados", type: "chips", opt: true, label: "Em quais canais?", options: [
        "Meta (Insta/Face)", "Google", "TikTok", "YouTube", "Influenciadores", "Nenhum",
      ] },
      { id: "investimento", type: "text", opt: true, label: "Quanto já investiu e qual foi o resultado?", placeholder: "Ex.: R$ 2k/mês, CPL ~R$ 18" },
      { id: "aprendizados", type: "textarea", opt: true, label: "O que funcionou e o que deu errado?", placeholder: "Criativos campeões, públicos, o que evitar..." },
    ],
  },

  /* 8 — Concorrentes */
  {
    id: "concorrentes",
    eyebrow: "Bloco 08 — Mercado",
    title: "Quem são as referências e os concorrentes?",
    sub: "A gente estuda o que já existe pra te posicionar diferente.",
    fields: [
      { id: "concorrentes", type: "textarea", opt: true, label: "Principais concorrentes", placeholder: "Nomes, @s ou sites" },
      { id: "ref_gosta", type: "textarea", opt: true, label: "Anúncios ou páginas que você admira", placeholder: "O que te inspira e por quê" },
      { id: "evitar", type: "text", opt: true, label: "Posicionamento que quer evitar", placeholder: "Tom, estética ou abordagem que não combina" },
    ],
  },

  /* 9 — Criativos */
  {
    id: "criativos",
    eyebrow: "Bloco 09 — Criativos",
    title: "O que você já tem de material?",
    sub: "Define se a gente começa produzindo ou já parte pro ar.",
    fields: [
      { id: "criativos", type: "chips", opt: true, label: "Materiais disponíveis", options: [
        "Fotos profissionais", "Vídeos", "Depoimentos gravados", "Antes e depois",
        "Banco de imagens", "Materiais comerciais",
      ] },
      { id: "identidade", type: "choice", opt: true, label: "Identidade visual (logo, cores, fontes)", options: [
        { v: "Tenho tudo definido", k: "yes" }, { v: "Tenho parcial", k: "soft" }, { v: "Não tenho", k: "no" },
      ] },
    ],
  },

  /* 10 — Acessos */
  {
    id: "acessos",
    eyebrow: "Bloco 10 — Acessos",
    title: "Vamos mapear os acessos.",
    sub: "Marque o status de cada um — é o que destrava o início da operação.",
    fields: [
      { id: "acessos", type: "access", items: [
        "Meta Business", "Conta de anúncios", "Página no Facebook", "Instagram profissional",
        "Pixel / API de Conversões", "Domínio próprio", "Google Ads", "Google Analytics",
        "Gerenciador de Tags", "Search Console", "Landing page", "CRM", "WhatsApp Business",
      ] },
    ],
  },

  /* 11 — Verba */
  {
    id: "verba",
    eyebrow: "Bloco 11 — Verba & prazo",
    title: "Por fim, verba e expectativa.",
    sub: "Pra desenhar uma estrutura realista e definir o teste inicial.",
    fields: [
      { id: "verba_mensal", type: "money", label: "Verba mensal de mídia", min: 0, max: 30000, step: 100, placeholder: "Quanto investir por mês" },
      { id: "data_inicio", type: "date", label: "Data de início desejada" },
      { id: "sazonalidade", type: "text", label: "Datas importantes / sazonalidades", placeholder: "Black Friday, datas do nicho, lançamentos..." },
    ],
  },

  /* 12 — REPORT handled specially */
  { id: "report", kind: "report" },
];

const FIRST_Q = 1;
const LAST_Q = STEPS.length - 2; // last question step (verba)

/* -------- helpers -------- */
const has = (v) => v !== undefined && v !== null && (Array.isArray(v) ? v.length : String(v).trim().length);
const arr = (v) => (Array.isArray(v) ? v : v ? [v] : []);
function formatBRL(n) { const x = Number(n) || 0; return "R$ " + x.toLocaleString("pt-BR"); }

/* progress — fraction of REQUIRED + key fields filled across question steps */
function computeProgress(a) {
  const keys = ["nome_empresa", "objetivo", "produto", "ticket", "cliente_ideal",
    "diferenciais", "destino", "ja_anunciou", "criativos", "acessos", "verba_mensal"];
  let filled = 0;
  keys.forEach((k) => {
    const v = a[k];
    if (k === "acessos") { if (v && Object.keys(v).length) filled++; }
    else if (has(v)) filled++;
  });
  return Math.round((filled / keys.length) * 100);
}

/* recommend channels from objective + ticket + funnel */
function recommendChannels(a) {
  const obj = arr(a.objetivo);
  const out = new Map();
  const add = (n, why) => { if (!out.has(n)) out.set(n, why); };

  if (obj.includes("Conversas no WhatsApp") || obj.includes("Gerar leads") || obj.includes("Agendamentos"))
    add("Meta Ads — Leads", "objetivo de captação");
  if (obj.includes("Venda direta / e-commerce")) { add("Meta Ads — Vendas", "conversão direta"); add("Google Shopping", "intenção de compra"); }
  if (obj.includes("Tráfego pra página")) add("Google Search", "demanda ativa");
  if (obj.includes("Reconhecimento de marca")) { add("Meta — Alcance", "topo de funil"); add("YouTube / Reels", "vídeo de marca"); }
  if (obj.includes("Mais seguidores")) add("Instagram — Engajamento", "crescimento de base");
  if (obj.includes("Remarketing") || true) add("Remarketing", "reimpactar quem não fechou");

  if (Number(a.ticket) >= 2000) add("Google Search", "ticket alto pede intenção");

  if (arr(a.destino).includes("WhatsApp")) add("Click-to-WhatsApp", "destino do lead");
  if (!out.size) add("Meta Ads", "base de qualquer estratégia");
  return [...out].slice(0, 6).map(([name, why]) => ({ name, why }));
}

/* creative angles from differentials + proofs + pains */
function creativeAngles(a) {
  const out = [];
  const provas = arr(a.provas);
  if (provas.includes("Depoimentos") || provas.includes("Avaliações 5★")) out.push("Prova social — vozes de clientes reais");
  if (provas.includes("Antes e depois")) out.push("Antes e depois — transformação visível");
  if (provas.includes("Resultados em números") || provas.includes("Cases de sucesso")) out.push("Resultado em números — credibilidade");
  if (provas.includes("Autoridade / mídia") || provas.includes("Certificações")) out.push("Autoridade — por que confiar em você");
  if (has(a.dores)) out.push("Dor → solução — fala direto com a objeção");
  if (has(a.garantia)) out.push("Quebra de risco — destaque da garantia");
  if (has(a.diferenciais)) out.push("Mecanismo único — seu diferencial como gancho");
  if (!out.length) out.push("Oferta direta — clareza de proposta de valor");
  return out.slice(0, 6);
}

/* initial campaign structure */
function campaignStructure(a) {
  const obj = arr(a.objetivo);
  const stages = [];
  const wantsAware = obj.includes("Reconhecimento de marca") || obj.includes("Mais seguidores");
  if (wantsAware)
    stages.push({ n: "Topo", t: "Reconhecimento", d: "Vídeos curtos de marca e conteúdo pra alcançar público frio e construir audiência." });
  stages.push({ n: wantsAware ? "Meio" : "Topo", t: "Captação / Consideração", d: `Campanhas de conversão levando ${arr(a.destino)[0] || "o lead"} a ${arr(a.destino).includes("WhatsApp") ? "abrir conversa no WhatsApp" : "deixar o contato"}.` });
  stages.push({ n: "Fundo", t: "Remarketing & fechamento", d: "Reimpacto de quem clicou e não converteu, com prova social e oferta para acelerar a decisão." });
  return stages;
}

/* pending access list */
function pendingAccess(a) {
  const ac = a.acessos || {};
  return Object.entries(ac).filter(([, s]) => s === "make" || s === "no").map(([k, s]) => ({ name: k, status: s }));
}

/* attention points */
function attentionPoints(a) {
  const out = [];
  if (a.follow_up === "Não tem") out.push("Sem follow-up estruturado — leads esfriam e a verba rende menos. Sugerimos uma cadência mínima.");
  if (["Algumas horas", "No mesmo dia", "Mais de 1 dia"].includes(a.tempo_resposta)) out.push("Resposta lenta ao lead. Cada hora derruba a taxa de conversão — vale automatizar o primeiro contato.");
  if (Number(a.verba_mensal) > 0 && Number(a.verba_mensal) < 1500) out.push("Verba enxuta: foco em um único objetivo e público por vez para gerar dados confiáveis antes de escalar.");
  if (a.identidade === "Não tenho") out.push("Sem identidade visual definida — entra uma etapa de produção criativa antes de subir as campanhas.");
  if (!arr(a.criativos).length) out.push("Pouco material disponível: planejar uma produção inicial de fotos/vídeos.");
  if (a.ja_anunciou === "Nunca anunciei") out.push("Conta nova de anúncios: período de aprendizado do algoritmo no início, com resultados estabilizando após as primeiras semanas.");
  if (pendingAccess(a).length) out.push(`${pendingAccess(a).length} acesso(s) pendente(s) — destravar antes do go-live.`);
  if (!out.length) out.push("Cenário saudável: operação pronta para subir com estrutura de teste e leitura de dados desde o dia 1.");
  return out;
}

/* next steps */
function nextSteps(a) {
  const out = ["Validação do diagnóstico e alinhamento da estratégia com você."];
  if (pendingAccess(a).length) out.push("Liberação e configuração dos acessos pendentes (Meta, pixel, domínio).");
  if (a.identidade === "Não tenho" || !arr(a.criativos).length) out.push("Briefing e produção dos primeiros criativos.");
  out.push("Estruturação das campanhas e públicos no gerenciador.");
  out.push(`Subida do teste inicial${a.data_inicio ? " (alvo: " + a.data_inicio + ")" : ""} e leitura dos primeiros dados.`);
  return out;
}

/* validation — every field is required */
function isFieldFilled(f, v) {
  switch (f.type) {
    case "chips":  return Array.isArray(v) && v.length > 0;
    case "money":  return v !== undefined && v !== null && v !== "" && Number(v) > 0;
    case "access": return !!v && f.items.every((it) => v[it]);
    default:       return has(v);
  }
}
function stepComplete(step, answers) {
  if (!step.fields) return true;
  return step.fields.every((f) => isFieldFilled(f, answers[f.id]));
}

Object.assign(window, {
  STEPS, FIRST_Q, LAST_Q,
  has, arr, formatBRL, isFieldFilled, stepComplete,
  computeProgress, recommendChannels, creativeAngles,
  campaignStructure, pendingAccess, attentionPoints, nextSteps,
});
