// js/components/pages/ZaynexChat.jsx
// Chat IA assistente (Zaynex) + modais de aprovação
// Extraído de index.html em Fase 6 (2026-04-29): L6740-L7167
// Deps runtime: showConfirm, Modal, SmartSelect, CancelApprovalModal, DiscountApprovalModal, CatalogoVendedor
(function() {
  'use strict';
  const {useState, useEffect, useRef} = React;

function ZaynexChat({user,products=[],sales=[],clients=[]}){
  const[open,setOpen]=useState(false);
  const[msgs,setMsgs]=useState([]);
  const[input,setInput]=useState('');
  const[loading,setLoading]=useState(false);
  const bottomRef=useRef(null);
  const inputRef=useRef(null);

  const roleInfo={
    admin:{label:'Assistente Executivo',icon:'🏢',color:'#2563EB',hint:'Estratégia, análise de negócio, gestão...'},
    vendedor:{label:'Especialista em Perfumes',icon:'🌹',color:'#E8A0BF',hint:'Fragrâncias, técnicas de venda, produtos...'},
    estoquista:{label:'Assistente de Estoque',icon:'📦',color:'#7BC67E',hint:'Inventário, armazenamento, operações...'},
    financeiro:{label:'Assistente Financeiro',icon:'💰',color:'#7EB8F7',hint:'DRE, fluxo de caixa, tributos, KPIs...'},
  };
  const ri=roleInfo[user.role]||roleInfo.admin;
  const color=ri.color;

  useEffect(()=>{if(open){const t=setTimeout(()=>bottomRef.current?.scrollIntoView({behavior:'smooth'}),60);return()=>clearTimeout(t);}},[msgs,open]);
  useEffect(()=>{if(open){const t=setTimeout(()=>inputRef.current?.focus(),150);return()=>clearTimeout(t);}},[open]);

  async function send(){
    if(!input.trim()||loading)return;
    const userMsg={role:'user',content:input.trim()};
    const history=[...msgs,userMsg];
    setMsgs(history);setInput('');setLoading(true);
    const systemPrompt={role:'user',parts:[{text:`Você é um assistente da ZAYNEX Distribuidora de Perfumes. Papel atual: ${user.role}. Seja objetivo e profissional. Responda em português.`}]};
    const geminiMsgs=history.map(m=>({role:m.role==='assistant'?'model':'user',parts:[{text:m.content}]}));
    // ── Estoque dinâmico: filtra por palavras da pergunta ──
    const lastUserMsg=input.trim().toLowerCase()
      .normalize('NFD').replace(/[\u0300-\u036f]/g,'');
    const queryWords=lastUserMsg.split(/\s+/).filter(w=>w.length>2);
    const mentionsDecant=queryWords.some(w=>'decante decant amostra decants'.includes(w)||'decant'.includes(w));
    const mentionsPerfume=queryWords.some(w=>'perfume frasco 100ml'.includes(w));
    // score de relevância: produto que bater mais palavras vem primeiro
    function scoreProduct(p){
      const hay=`${p.brand||''} ${p.name||''} ${p.volume||''} ${p.category||''}`.toLowerCase()
        .normalize('NFD').replace(/[\u0300-\u036f]/g,'');
      return queryWords.filter(w=>hay.includes(w)).length;
    }
    const allPerfumes=products.filter(p=>p.category!=='Decants');
    const allDecants=products.filter(p=>p.category==='Decants');
    // Se a pergunta menciona palavra específica, manda produtos relevantes + top geral
    const relevantPerfumes=[...allPerfumes].sort((a,b)=>scoreProduct(b)-scoreProduct(a));
    const relevantDecants=[...allDecants].sort((a,b)=>scoreProduct(b)-scoreProduct(a));
    // Manda: os 80 mais relevantes + sempre os 20 com maior estoque (top sellers)
    const topPerfumes=[...new Map([
      ...relevantPerfumes.slice(0,80),
      ...[...allPerfumes].sort((a,b)=>b.stock-a.stock).slice(0,20)
    ].map(p=>[p.id,p])).values()];
    const topDecants=relevantDecants.slice(0,80);
    const fmtProd=p=>`${p.brand} ${p.name||''} ${p.volume||''}${p.stock>0?' | estq:'+p.stock:' | SEM ESTOQUE'} | R$${(p.salePrice||0).toFixed(0)}`;
    const inventoryBlock=[
      `PERFUMES relevantes para esta conversa (${topPerfumes.length} de ${allPerfumes.length} total):`,
      ...topPerfumes.map(fmtProd),
      ``,
      `DECANTS 5ml relevantes (${topDecants.length} de ${allDecants.length} total — sempre vendável):`,
      ...topDecants.map(p=>`${p.brand} ${p.name||''} | R$${(p.salePrice||0).toFixed(0)}`),
      ``,
      `(Se precisar de outro produto específico, peça pelo nome da marca ou produto)`
    ].join('\n');

    const PERFUME_EXPERT_PROMPT=`Você é a especialista da ZAYNEX Distribuidora de Perfumes — expert em perfumaria E em vendas consultivas de alto desempenho.

═══ IDENTIDADE ═══
Você combina duas especializações:
1. Sommelier de fragrâncias (perfumaria árabe e europeia)
2. Consultora de vendas especializada em cosméticos e perfumes de luxo

═══ ESTOQUE ATUAL DA ZAYNEX ═══
Use APENAS estes produtos ao fazer recomendações. Nunca invente produtos fora desta lista.

${inventoryBlock}

═══ CONTEXTO DO NEGÓCIO — MUITO IMPORTANTE ═══
A ZAYNEX vende EXCLUSIVAMENTE para lojistas (B2B). TODOS os clientes são revendedores:
• Revendedores autônomos (vendem pelo WhatsApp/Instagram/TikTok)
• Salões de beleza e barbearias
• Lojas de perfumaria e cosméticos
• Atacadistas e distribuidores regionais
NÃO existe venda direta ao consumidor final. O lojista compra da ZAYNEX e revende para seus clientes.
Portanto: SEMPRE pense em margem, giro, mix e facilidade de revenda — nunca em uso pessoal.

═══ NOTAS OLFATIVAS ═══
• Cítrico: bergamota, limão, laranja — frescos, verão, giro rápido nas lojas
• Floral: rosa, jasmim, íris, ylang-ylang — femininos, mais vendidos para público feminino
• Amadeirado: sândalo, cedro, oud, vetiver, patchouli — elegantes, alta fixação, premium
• Oriental: âmbar, baunilha, resinas, incenso — sensuais, noite, inverno, ticket alto
• Aquático: notas marinhas, ozônico, almíscar branco — frescos, unissex, trabalho, fácil de vender
• Gourmand: baunilha, caramelo, chocolate — doces, jovens, muito pedido por mulheres
• Especiarias: cravo, canela, cardamomo, açafrão — exóticos, árabes, diferenciação
• Couro: notas curtidas, fumaça — sofisticados, masculinos, nicho premium

═══ MARCAS DO PORTFÓLIO ═══
• Lattafa, Rasasi, Al Haramain, Swiss Arabian, Ajmal, Armaf, Maison Alhambra, Paris Corner, ARD Al Zaafaran, Afnan, Zimaya, Assad, Emaan, Yara
• Perfumes árabes: fixação 8-12h, projeção intensa, margens altas, diferenciação total
• Concentrações: Extrait (8-12h) > EDP (6-8h) > EDT (4-6h) — quanto mais concentrado, mais premium
• Decants 5ml: amostras — SEMPRE disponível mesmo sem estoque do frasco. Ferramenta de venda poderosa

═══ VOCABULÁRIO ═══
• Sillage: rastro no ar / Fixação: quanto tempo dura / Projeção: distância que irradia
• Dry down: como evolui após 30min / Top note: primeiros 15min / Base note: fundo horas depois
• Giro: velocidade que o produto vende / Margem: lucro do lojista na revenda

═══ TÉCNICAS DE VENDA PARA LOJISTAS ═══

ABORDAGEM INICIAL:
• Pergunta de ouro: "O que tá girando mais na sua loja essa semana?" → entende o perfil dos clientes do lojista
• "Qual sua margem média hoje nos perfumes?" → abre espaço para mostrar vantagem
• "Você vende mais masculino, feminino ou unissex?" → monta mix personalizado
• Nunca oferecer produto aleatório — primeiro entender o negócio do lojista

ARGUMENTOS PODEROSOS:
• "Árabe tem fixação de 8-12h. Seu cliente usa, os amigos perguntam, ele volta comprar mais. Venda recorrente natural."
• "Enquanto seu concorrente vende Boticário, você oferece o que ninguém tem. Diferenciação vale mais que preço."
• "Compra direto da distribuidora — sem intermediário. Sua margem vai de 40% para 80-100% dependendo do produto."
• "Decant 5ml é a ferramenta mais inteligente: seu cliente experimenta hoje, aprova, compra o frasco amanhã."
• "Entrega para todo Brasil. Você vende pelo Instagram, nós despachamos, você lucra sem sair de casa."

UPSELL E CROSS-SELL:
• Lojista comprou 5 fracos → "Leva 10 decants sortidos pra dar de brinde/amostra. Seu cliente experimenta um diferente e volta querendo o frasco."
• Lojista comprou masculinos → "Seu cliente masculino tem esposa/namorada. Quer algumas opções femininas pra ele levar de surpresa?"
• Lojista comprou best-sellers → "Esses giram rápido. Quer reservar a próxima remessa já? Estoque desses costuma acabar."

URGÊNCIA REAL (usar só quando verdade):
• Produto com estoque ≤5: "Esse aqui tá nas últimas unidades. Se você quiser garantir, melhor fechar hoje."
• "Essa marca costuma demorar na reposição. Lojistas que pegam quando tem não ficam sem."

═══ SCRIPTS COMPROVADOS DE FECHAMENTO ═══

SCRIPT 1 — Lojista novo sem experiência com árabe:
"Entendo que você ainda não trabalhou com árabe. Então faz assim: começa pequeno pra testar o mercado. Pega 3 fracos do Lattafa Asad (masculino mais pedido) + 3 do Yara Rosa (feminino que gira muito) + 10 decants sortidos pra seus clientes provarem. Investimento baixo, você vê a reação dos seus clientes, e aí a gente conversa sobre escalar. O risco é mínimo, o potencial é grande."

SCRIPT 2 — Lojista que já compra e quer aumentar variedade:
"Você já tem os best-sellers rodando bem. Agora é hora de agregar ticket médio. Pega 2-3 produtos mais premium — o cliente que já compra de você, quando vê algo mais sofisticado na loja, gasta mais. Não precisa trocar o que funciona, só adiciona uma camada acima."

SCRIPT 3 — Fechar pedido que está emperrado:
"Me fala o que tá te travando. Se é questão de mix, eu ajudo a montar. Se é volume mínimo, a gente vê o que encaixa no seu orçamento. Quero que você saia daqui com um pedido que faça sentido pro seu negócio — não adianta você comprar o que não vai girar."

SCRIPT 4 — Reativar lojista que sumiu:
"Você comprou com a gente há X tempo. Queria saber como foi, se os produtos giraram bem, e te mostrar as novidades que chegaram. Temos alguns lançamentos que tão bomando com outros lojistas do seu perfil."

═══ OBJEÇÕES REAIS E COMO RESPONDER ═══

"TÁ CARO / NÃO TENHO DINHEIRO AGORA"
→ "Entendo. Mas me diz: quanto você tá deixando de lucrar por mês por não ter esse produto? Se você vender 5 fracos com margem de R$80 cada, são R$400 de lucro puro. O investimento se paga na primeira semana. Quer que eu monte um kit menor pra você começar?"
→ Se persistir: "Posso separar um mix menor — 3 fracos + alguns decants — pra você testar com menos capital e ver o retorno antes de escalar."

"MEU ESTOQUE TÁ CHEIO"
→ "Que produtos estão parados? Me fala o que não tá girando. Às vezes o problema não é o volume, é o mix errado. Posso te ajudar a identificar o que vende rápido pra dar liquidez pro que tá parado."
→ "Os que ficam encalhados geralmente são os que todo mundo tem. Os árabes que trabalhamos têm giro diferente — seu cliente não acha em outro lugar."

"JÁ TENHO FORNECEDOR"
→ "Ótimo, não quero que você troque — quero complementar. O que seu fornecedor atual tem que nós não temos? E o que temos que ele não tem? Árabe provavelmente não está no portfólio dele."
→ "Trabalhar com mais de um fornecedor é estratégia inteligente. Se um atrasa ou falta produto, o outro garante. Além de ampliar seu mix."

"NÃO CONHEÇO ESSA MARCA"
→ "Seus clientes finais também não conheciam — até usar. Lattafa e Rasasi exportam para mais de 80 países. Fixação de 8-10h que perfume nacional não chega perto. Quando seu cliente usa uma vez, pergunta de onde veio e volta comprar."
→ "Justamente por ser pouco conhecida é uma oportunidade. Você vira referência antes dos seus concorrentes."

"PRECISO PENSAR / VOU VER"
→ "Claro. O que precisa de mais informação pra te ajudar a decidir? Preço? Mix? Condição de entrega? Me fala o que tá na sua cabeça que eu resolvo agora."
→ "Só te aviso que [produto X] tá com estoque baixo. Se fechar hoje garante. Se quiser, fecho o pedido e você tem 24h pra confirmar — sem compromisso."

"MEUS CLIENTES NÃO VÃO GOSTAR"
→ "De onde vem essa certeza? A maioria dos lojistas que fala isso, quando experimenta com 3-5 fracos, se surpreende com a receptividade. Árabe tem fixação muito superior — o cliente percebe a diferença na pele."
→ "Proposta: pega 5 decants de marcas diferentes pra deixar seus clientes testarem. Se em 2 semanas nenhum perguntar de onde veio, me liga. Mas vai perguntar."

"VOCÊS FAZEM CONSIGNADO?"
→ "Consignado não trabalhamos. Mas o risco que você tá com medo é o de encalhar, certo? Por isso o kit de entrada com decants existe — você investe pouco, testa o mercado dos seus clientes, e só escala quando ver que funciona."

"QUAL O PEDIDO MÍNIMO?"
→ Não temos pedido mínimo fixo — mas para entrega viável, recomendo a partir de R$X. Consultar admin se tiver dúvida de valor exato.

═══ TIPOS DE LOJISTAS E ABORDAGEM CERTA ═══
• Revendedor autônomo (WhatsApp/Instagram): foco em produtos fotogênicos, embalagem bonita, fácil de explicar. Decants são ótimos — baixo investimento, alta margem percentual
• Salão de beleza/barbearia: produto fica exposto durante atendimento, cliente cheira e compra. Priorizar fixação e projeção — "o perfume que o cliente vai perguntar de onde veio"
• Loja de perfumaria: quer variedade e exclusividade. Montar mix diversificado com clássicos + novidades + nicho
• Atacadista/distribuidor: volume e preço. Focar em best-sellers de giro garantido, condição de volume

═══ KITS SUGERIDOS ═══
• Kit Teste (R$ baixo): 3 fracos best-seller + 10 decants sortidos — para lojista novo ou receoso
• Kit Salão: 6-8 fracos variados (masc/fem/unis) + 15 decants para amostra durante atendimento
• Kit Reposição: só os best-sellers que o lojista já sabe que gira — fechar rápido
• Kit Lançamento: novidades para lojista que já tem base de clientes fiéis

═══ COMO RESPONDER (FORMATO E TOM) ═══
• Seja direta e prática — a vendedora está no meio de um atendimento, tempo é dinheiro
• Use emojis com moderação: 💰 margem/dinheiro, 🪵 amadeirado, 🌸 floral, ✨ premium, 🔥 giro rápido
• Quando recomendar produto: **nome em negrito** | família olfativa | por que gira bem | preço
• Múltiplas opções: lista numerada, melhor opção primeiro
• SEMPRE termine com próximo passo ou pergunta de fechamento
• Foco 100% em negócio do lojista: margem, giro, mix, diferenciação — nunca "uso pessoal"
• Se produto sem estoque: diga e ofereça alternativa imediatamente

═══ EXEMPLOS DE CONVERSA ═══

EXEMPLO 1 — Lojista iniciante:
Vendedora: "Lojista novo, nunca trabalhou com árabe, não sabe o que pegar"
Resposta: "Perfeito pra começar! Monte o kit de entrada — baixo risco, teste de mercado:
💰 **Kit Iniciante sugerido:**
• 3x **Lattafa Asad 100ml** — masculino mais pedido, alta fixação, gira muito
• 3x **Yara Rosa 100ml** — feminino best-seller, floral suave, fácil de vender
• 10x decants sortidos 5ml — deixa seus clientes provarem, cria demanda pro frasco
Investimento baixo, você vê a reação dos seus clientes em 1 semana. Quer que eu calcule o valor total desse kit?"

EXEMPLO 2 — Objeção "tá caro":
Vendedora: "Lojista falou que tá caro"
Resposta: "Usa assim: 'Entendo. Mas pensa comigo — cada frasco que você vende com margem de R$80, em 5 vendas você recuperou o investimento e tudo que vier depois é lucro puro. Árabe você vende pelo menos 2x mais caro que produto nacional com o mesmo custo pra você.' Se ainda resistir, propõe o kit menor — 3 fracos + decants — pra ele testar com menos capital. Quer que eu sugira um kit de entrada mais enxuto?"

EXEMPLO 3 — Lojista sumido/reativação:
Vendedora: "Cliente não compra há 2 meses, quero reativar"
Resposta: "Abordagem ideal: menciona que vieram novidades desde a última compra, e pergunta como foram os produtos que ele levou. 'Oi [nome], tudo bem? Os [produtos X] que você levou giraram bem? Chegaram algumas novidades aqui que tão bombando com outros lojistas do seu perfil — queria te mostrar antes de anunciar pra todo mundo.' Cria exclusividade e abre a conversa. Quer que eu veja o histórico dele pra sugerir o que faz sentido oferecer?"

EXEMPLO 4 — Montar mix para salão:
Vendedora: "Salão quer montar um mix de perfumes pra vender durante atendimento"
Resposta: "Salão é ótimo canal! Produto fica exposto, cliente cheira durante o atendimento, pergunta e compra na hora. Pra salão o ideal é:
🌸 2x feminino floral — o que mais sai pra mulher (Yara Rosa, Emaan)
🪵 2x masculino amadeirado — pra homem no corte (Asad, algo com oud)
✨ 1x unissex premium — pra quem quer algo diferente
🔥 10x decants sortidos — isca perfeita, cliente prova, volta pro frasco
Fixação alta é essencial — o cliente precisa sentir durante HORAS no atendimento. Quantos atendimentos o salão faz por dia? Assim calculo o potencial de venda mensal."

═══ REGRAS FIXAS ═══
• Responda SEMPRE em português do Brasil
• NUNCA invente produto que não está no estoque listado acima
• Se o estoque estiver zerado, diga e ofereça alternativa
• Produto com estoque ≤3: mencione como "últimas unidades"
• Papel da usuária: ${user.role}
• Total de clientes: ${clients.length} | Vendas realizadas: ${sales.length}
• Ao final de cada resposta: sempre uma pergunta ou próximo passo sugerido`;
    try{
      // [P0-01] Usa exclusivamente o proxy seguro via Edge Function (gemini-proxy).
      // [SEC-9C] Envia access_token da sessão (JWT real) em vez da anon key pública.
      const {data:{session}}=await sb.auth.getSession();
      const bearerToken=session?.access_token||SUPABASE_KEY;
      const res=await fetch(GEMINI_PROXY_URL,{
        method:'POST',
        headers:{'Content-Type':'application/json','Authorization':'Bearer '+bearerToken},
        body:JSON.stringify({system_instruction:{parts:[{text:PERFUME_EXPERT_PROMPT}]},contents:geminiMsgs,model:'gemini-2.5-flash'}),
      });
      if(res.status===401){
        setMsgs(m=>[...m,{role:'assistant',content:'❌ Sessão expirada. Faça login novamente.'}]);
      }else if(res.status===429){
        setMsgs(m=>[...m,{role:'assistant',content:'⏳ Muitas mensagens por minuto. Aguarde e tente novamente!'}]);
      }else{
        const data=await res.json();
        if(data.error){
          const msg=data.error.message||'';
          const overloaded=msg.toLowerCase().includes('overloaded')||msg.toLowerCase().includes('high demand')||data.error.code===503||data.error.code===429;
          if(overloaded){
            setMsgs(m=>[...m,{role:'assistant',content:'⏳ O servidor está com muita demanda agora. Aguarde alguns segundos e tente novamente!'}]);
          }else{
            setMsgs(m=>[...m,{role:'assistant',content:`❌ ${msg}`}]);
          }
        }else{
          const reply=data.candidates?.[0]?.content?.parts?.[0]?.text||'Sem resposta';
          setMsgs(m=>[...m,{role:'assistant',content:reply}]);
        }
      }
    }catch(e){
      setMsgs(m=>[...m,{role:'assistant',content:`❌ Erro de conexão: ${e.message}`}]);
    }
    setLoading(false);
  }

  // Formata markdown simples (bold, listas)
  function renderMsg(text){
    const lines=text.split('\n');
    return lines.map((line,i)=>{
      // Bold **text**
      const parts=line.split(/(\*\*[^*]+\*\*)/g).map((p,j)=>
        p.startsWith('**')&&p.endsWith('**')
          ?<strong key={j} style={{color:'#374151'}}>{p.slice(2,-2)}</strong>
          :<span key={j}>{p}</span>
      );
      const isListItem=line.match(/^[-•·]\s/)||line.match(/^\d+\.\s/);
      return(
        <div key={i} style={{
          paddingLeft:isListItem?8:0,
          borderLeft:isListItem?`2px solid ${color}44`:'none',
          marginBottom:line===''?4:1,
        }}>
          {parts}
        </div>
      );
    });
  }

  const suggestions={
    vendedor:['Qual perfume indicar para presente masculino?','Compare Armaf CDN com Creed Aventus','Como vender Oud Elite para cliente premium?'],
    estoquista:['Como calcular ponto de reposição?','Cuidados para armazenar perfumes corretamente','Como fazer inventário rotativo?'],
    financeiro:['Como calcular margem bruta?','Explica o ciclo financeiro da empresa','Melhores KPIs para distribuidora'],
    admin:['Analise a estratégia de vendas atual','Como melhorar o giro de estoque?','Quais marcas priorizar para crescimento?'],
  };
  const sugs=suggestions[user.role]||suggestions.admin;

  return(
    <>
      {/* Botão flutuante */}
      <button
        onClick={()=>setOpen(o=>!o)}
        title={open?'Fechar chat':'Abrir assistente IA'}
        style={{
          position:'fixed',bottom:28,right:28,zIndex:9999,
          width:54,height:54,borderRadius:'50%',
          background:open?'#F9FAFB':`linear-gradient(135deg,${color}22,${color}11)`,
          border:`2px solid ${open?'#3A3A3A':color}`,
          cursor:'pointer',boxShadow:`0 4px 24px ${color}44`,
          fontSize:22,display:'flex',alignItems:'center',justifyContent:'center',
          transition:'all 0.2s',
        }}
      >
        {open?<span style={{color:'#9CA3AF',fontSize:18}}>✕</span>:<span>✦</span>}
      </button>

      {/* Painel do chat */}
      {open&&(
        <div style={{
          position:'fixed',bottom:94,right:28,zIndex:9998,
          width:390,height:580,borderRadius:16,
          background:'#F0F2F5',border:`1px solid ${color}33`,
          boxShadow:`0 12px 48px #00000099,0 0 0 1px ${color}1A`,
          display:'flex',flexDirection:'column',overflow:'hidden',
        }}>

          {/* Header */}
          <div style={{
            padding:'12px 16px',borderBottom:`1px solid ${color}22`,
            background:'#1C1C28',
            display:'flex',alignItems:'center',gap:10,
          }}>
            <div style={{
              width:36,height:36,borderRadius:'50%',flexShrink:0,
              background:`${color}22`,border:`1px solid ${color}44`,
              display:'flex',alignItems:'center',justifyContent:'center',fontSize:16,
            }}>{ri.icon}</div>
            <div style={{flex:1,minWidth:0}}>
              <div style={{fontWeight:700,color,fontSize:13,whiteSpace:'nowrap',overflow:'hidden',textOverflow:'ellipsis'}}>{ri.label}</div>
              <div style={{fontSize:10,color:'#6B7280',marginTop:1}}>Gemini · {user.name}</div>
            </div>
              <button
                onClick={async()=>{if(await showConfirm({title:'Limpar Conversa',message:'Limpar conversa?',confirmText:'Limpar'}))setMsgs([]);}}
                title="Limpar conversa"
                style={{background:'none',border:'none',color:'#6B7280',cursor:'pointer',fontSize:14,padding:4}}
              >🗑</button>
          </div>

          {/* IA assistente — proxy seguro (P0-01) */}
          <>
              {/* Mensagens */}
              <div style={{flex:1,overflowY:'auto',padding:'14px 14px 8px',display:'flex',flexDirection:'column',gap:10}}>

                {/* Estado inicial — sugestões */}
                {msgs.length===0&&(
                  <div style={{display:'flex',flexDirection:'column',gap:10}}>
                    <div style={{color:'#3A3A3A',fontSize:12,textAlign:'center',padding:'8px 0'}}>
                      {ri.icon} Olá, {user.name.split(' ')[0]}! Como posso ajudar?
                    </div>
                    <div style={{color:'#6B7280',fontSize:11,textAlign:'center',marginBottom:4}}>{ri.hint}</div>
                    {sugs.map((s,i)=>(
                      <button
                        key={i}
                        onClick={()=>{setInput(s);setTimeout(()=>inputRef.current?.focus(),50);}}
                        style={{
                          background:'#FFFFFF',border:`1px solid #2A2A2A`,borderRadius:8,
                          padding:'9px 12px',color:'#9CA3AF',fontSize:12,cursor:'pointer',
                          textAlign:'left',transition:'border-color 0.15s',
                        }}
                        onMouseEnter={e=>e.currentTarget.style.borderColor=color+'66'}
                        onMouseLeave={e=>e.currentTarget.style.borderColor='#E4E7EC'}
                      >{s}</button>
                    ))}
                  </div>
                )}

                {/* Histórico de mensagens */}
                {msgs.map((m,i)=>(
                  <div key={i} style={{
                    alignSelf:m.role==='user'?'flex-end':'flex-start',
                    maxWidth:'88%',
                    background:m.role==='user'?`${color}18`:'#141414',
                    border:`1px solid ${m.role==='user'?color+'33':'#E4E7EC'}`,
                    borderRadius:m.role==='user'?'14px 14px 4px 14px':'14px 14px 14px 4px',
                    padding:'9px 13px',fontSize:12.5,color:'#D8CDB8',lineHeight:1.55,
                  }}>
                    {m.role==='assistant'?renderMsg(m.content):<span>{m.content}</span>}
                  </div>
                ))}

                {/* Indicador de loading */}
                {loading&&(
                  <div style={{
                    alignSelf:'flex-start',background:'#FFFFFF',border:'1px solid #E4E7EC',
                    borderRadius:'14px 14px 14px 4px',padding:'10px 18px',
                  }}>
                    <span style={{color:color,fontSize:20,letterSpacing:4,animation:'metaPulse 1s infinite'}}>···</span>
                  </div>
                )}
                <div ref={bottomRef}/>
              </div>

              {/* Input */}
              <div style={{padding:'10px 12px',borderTop:'1px solid #F3F4F6',display:'flex',gap:8,alignItems:'flex-end'}}>
                <textarea
                  ref={inputRef}
                  value={input}
                  onChange={e=>setInput(e.target.value)}
                  onKeyDown={e=>{if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();send();}}}
                  placeholder="Pergunte qualquer coisa... (Enter para enviar)"
                  rows={1}
                  style={{
                    flex:1,background:'#FFFFFF',border:`1px solid #2A2A2A`,borderRadius:10,
                    padding:'9px 12px',color:'#374151',fontSize:13,outline:'none',
                    resize:'none',lineHeight:1.4,fontFamily:'inherit',maxHeight:80,overflowY:'auto',
                  }}
                  onFocus={e=>e.target.style.borderColor=color+'66'}
                  onBlur={e=>e.target.style.borderColor='#E4E7EC'}
                />
                <button
                  onClick={send}
                  disabled={loading||!input.trim()}
                  style={{
                    background:loading||!input.trim()?'#D1D5DB':color,
                    color:loading||!input.trim()?'#444':'#000',
                    border:'none',borderRadius:10,padding:'9px 14px',
                    cursor:loading||!input.trim()?'default':'pointer',
                    fontWeight:700,fontSize:15,transition:'all 0.15s',flexShrink:0,
                  }}
                >➤</button>
              </div>

          </>
        </div>
      )}
    </>
  );
}

  window.ZNX = window.ZNX || {};
  window.ZNX.components = window.ZNX.components || {};
  window.ZNX.components.ZaynexChat = ZaynexChat;
  window.ZaynexChat = ZaynexChat;

  window.ZNX.refactor_phase_6_loaded = window.ZNX.refactor_phase_6_loaded || {};
  window.ZNX.refactor_phase_6_loaded.ZaynexChat = true;

})();
