/* PORCEVILLE — Caco, vendedor virtual (IA) */

const CACO_SYSTEM = `Você é o Caco, vendedor virtual da Porceville (porcelanas e vidros personalizados, Joinville/SC, +30 anos de experiência). Tom: próximo e acolhedor, consultivo, bem-humorado na medida (1 emoji no máximo), profissional sem ser formal demais. Nunca use linguagem agressiva de vendas nem promessas exageradas. Responda SEMPRE em português, curto (máx ~5 linhas).

REGRA DE OURO: a Porceville trabalha SOB ORÇAMENTO — NUNCA invente preços nem valores. Quando o cliente quiser valores, oriente a adicionar os itens ao orçamento no app e enviar pelo WhatsApp, que a equipe responde com valores e prazos.

TÉCNICAS DE GRAVAÇÃO:
- Serigrafia: logo em 1 a 5 cores. Quantidade MÍNIMA de 35 unidades.
- Sublimação: impressão colorida total, chamada de "Multicor" no app. Disponível a partir de 1 peça (sem mínimo), em qualquer produto.
- Pronta entrega: produtos com selo "pronta entrega" no app têm estampas exclusivas Porceville, sem personalização e sem mínimo.

CATÁLOGO ATUAL (sem preços — lista gerada do cadastro real, sempre atualizada):
{{CATALOGO}}

PERFIS: empresa/brinde → categoria Canecas; bar/cervejaria → Canecos de Chopp ou Copos (sub Cerveja/Chopp); hotel/restaurante → Xícara com Pires ou Mesa & Complementos; presente individual/foto → qualquer produto em Multicor (sublimação, sem mínimo); revenda/estoque → produto com selo "pronta entrega".

FLUXO: entenda o uso (empresa? presente? bar?), a quantidade aproximada e quantas cores tem a logo. Se < 35 un, só dá Multicor (sublimação, a partir de 1 peça); a partir de 35 un libera a logo em 1–5 cores (serigrafia). Recomende no máx. 2 produtos por vez, pelo NOME EXATO do catálogo acima (nunca invente nome de produto que não está na lista). Feche orientando: "adiciona no orçamento e envia pelo WhatsApp que a equipe responde rapidinho".`;

const CACO_SUGGEST = [
  'Brindes pra minha empresa 🏢',
  'Canecos pra minha cervejaria 🍺',
  'Presente com foto, pode ser 1 só?',
  'Quanto custa a caneca?',
];

// catálogo do prompt gerado AO VIVO do cadastro (PORCE_DATA) — nunca fica desatualizado se o admin mudar categorias/produtos
function buildCacoCatalog() {
  const linhas = (PORCE_DATA.categories || [])
    .filter(c => c.id !== 'todos')
    .map(c => {
      const nomes = [...new Set(PORCE_DATA.products.filter(p => p.cat === c.id).map(p => displayName(p.name)))].slice(0, 8);
      return nomes.length ? `${c.label}: ${nomes.join(', ')}${nomes.length === 8 ? '…' : ''}` : null;
    })
    .filter(Boolean);
  return linhas.join('\n') || 'Catálogo em atualização — oriente o cliente a ver o app.';
}

// 1º produto ativo de uma categoria (opcionalmente filtrando kind) — sempre resolve pro catálogo atual, nunca um ID travado
function firstActiveByCat(catId, kind) {
  const p = PORCE_DATA.products.find(x => x.cat === catId && (!kind || x.kind === kind));
  return p ? p.id : undefined;
}

function cacoFallback(text) {
  const t = text.toLowerCase();
  if (/pre[çc]o|custa|valor|quanto/.test(t)) return { text: 'A gente trabalha sob orçamento — assim você recebe o valor certinho pro seu caso. Adiciona os itens no orçamento e envia pelo WhatsApp que a equipe responde rapidinho! 😉' };
  if (/cerveja|bar|chopp/.test(t)) return { text: 'Pra bares e cervejarias os Canecos de Chopp são o clássico. Gravamos sua logo em até 5 cores (mín. 35 un).', product: firstActiveByCat('chopp') };
  if (/presente|foto|1 |uma /.test(t)) return { text: 'Pra presente com foto a impressão Multicor é perfeita: colorida total e sem quantidade mínima — pode ser 1 unidade só! ✨', product: firstActiveByCat('canecas', 'sublime') };
  if (/empresa|brinde|corporativ/.test(t)) return { text: 'Pra brindes corporativos as Canecas fazem sucesso — sua logo entra em até 5 cores. Quantas unidades você precisa?', product: firstActiveByCat('canecas') };
  return { text: 'Me conta pra que você quer as peças — empresa, bar, hotel ou presente? E quantas unidades, mais ou menos? Assim eu já te indico o produto certo. 😊' };
}

function CacoProductCard({ id, app }) {
  const p = PORCE_DATA.getProduct(id);
  if (!p) return null;
  return (
    <button className="card" onClick={() => app.openDetail(id)} style={{ display: 'flex', gap: 12, padding: 10, marginTop: 8, maxWidth: 280, border: 'none', cursor: 'pointer', textAlign: 'left', alignItems: 'center', width: '100%' }}>
      <PPhoto kind={p.kind} illo={PORCE_ILLO.illoFor(p)} img={p.img} slot={`pcat-${p.id}`} placeholder="" style={{ width: 56, height: 56, borderRadius: 14, flex: 'none' }} />
      <div style={{ flex: 1, minWidth: 0 }}>
        <div style={{ fontWeight: 800, fontSize: 14, color: 'var(--navy)' }}>{p.name}</div>
        <div className="muted" style={{ fontSize: 12 }}>{p.detail}</div>
        <div className="quote-tag" style={{ fontSize: 12, marginTop: 2 }}>Sob orçamento</div>
      </div>
      <PIcon name="chevron" size={18} stroke="var(--ink-mute)" />
    </button>
  );
}

function detectPorceProducts(text) {
  const t = (text || '').toLowerCase();
  const hits = [];
  PORCE_DATA.products.forEach(p => {
    const n = p.name.toLowerCase();
    // o nome do catálogo é uma frase SEO longa; casa pelo trecho antes do 1º separador (·, |, -)
    const base = n.split(/\s*[·|]\s*|\s+-\s+/)[0].trim();
    if ((base && t.includes(base)) || t.includes(n)) hits.push(p.id);
  });
  return hits.slice(0, 1);
}

function CacoScreen({ app }) {
  const scrollRef = React.useRef(null);
  const [typing, setTyping] = React.useState(false);
  const [draft, setDraft] = React.useState('');

  React.useEffect(() => {
    const el = scrollRef.current; if (el) el.scrollTop = el.scrollHeight;
  }, [app.caco, typing]);

  const send = async (text) => {
    const t = text.trim(); if (!t) return;
    app.pushCaco({ id: Date.now(), role: 'user', text: t });
    setDraft('');
    setTyping(true);
    try {
      const cacoCfg = (PORCE_DATA.settings && PORCE_DATA.settings.caco) || {};
      const system = CACO_SYSTEM.replace('{{CATALOGO}}', buildCacoCatalog()) + (cacoCfg.memory ? `\n\nBASE DE CONHECIMENTO (atualizada pela equipe):\n${cacoCfg.memory}` : '');
      const history = app.caco.slice(-10).map(m => ({ role: m.role === 'user' ? 'user' : 'caco', text: m.text }));
      const model = cacoCfg.model || 'gemini-2.0-flash';
      let reply = null;
      if (cacoCfg.gemini_key) {
        // key cadastrada no admin → chama o Gemini direto
        const contents = [...history.map(m => ({ role: m.role === 'user' ? 'user' : 'model', parts: [{ text: m.text }] })), { role: 'user', parts: [{ text: t }] }];
        const r = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${cacoCfg.gemini_key}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ system_instruction: { parts: [{ text: system }] }, contents, generationConfig: { maxOutputTokens: 320, temperature: 0.7 } }) });
        const d = await r.json();
        reply = d && d.candidates && d.candidates[0] && d.candidates[0].content && d.candidates[0].content.parts && d.candidates[0].content.parts[0] && d.candidates[0].content.parts[0].text;
      } else {
        // sem key no admin → função serverless (env GEMINI_API_KEY)
        const r = await fetch('/api/caco', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ system, message: t, history, model }) });
        const d = await r.json();
        reply = d && d.reply;
      }
      if (!reply) throw new Error('sem resposta');
      setTyping(false);
      const clean = (reply || '').replace(/\*\*(.*?)\*\*/g, '$1').replace(/^\s*[-*]\s+/gm, '• ').trim();
      const prods = detectPorceProducts(clean);
      app.pushCaco({ id: Date.now() + 1, role: 'caco', text: clean || 'Me conta um pouco mais? 😊', product: prods[0] });
    } catch (e) {
      setTyping(false);
      const r = cacoFallback(t);
      app.pushCaco({ id: Date.now() + 1, role: 'caco', ...r });
    }
  };

  return (
    <div className="porc-app" style={{ display: 'flex', flexDirection: 'column', height: '100%', background: 'var(--porc-bg)' }}>
      {/* header */}
      <div style={{ paddingTop: 54, paddingBottom: 12, background: 'var(--surface)', borderBottom: '1px solid var(--line)', zIndex: 10 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '0 18px' }}>
          <div style={{ width: 46, height: 46, borderRadius: '50%', background: 'var(--navy)', border: '2px solid var(--gold)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 'none', position: 'relative' }}>
            <span style={{ fontFamily: 'var(--font-display)', color: 'var(--gold)', fontSize: 22 }}>C</span>
            <span style={{ position: 'absolute', bottom: 0, right: 0, width: 11, height: 11, borderRadius: '50%', background: 'var(--green)', border: '2px solid var(--surface)' }} />
          </div>
          <div style={{ flex: 1 }}>
            <div style={{ fontWeight: 800, fontSize: 17, fontFamily: 'var(--font-display)', color: 'var(--navy)' }}>Caco</div>
            <div style={{ fontSize: 12.5, color: 'var(--green)', fontWeight: 700 }}>online · seu consultor Porceville</div>
          </div>
          <PIcon name="spark" size={20} stroke="var(--gold)" />
        </div>
      </div>

      {/* mensagens */}
      <div ref={scrollRef} className="scroll" style={{ flex: 1, padding: '18px 16px 12px' }}>
        {app.caco.length === 0 && (
          <div style={{ textAlign: 'center', padding: '10px 12px 20px' }}>
            {/* vídeo de apresentação do Caco */}
            <div className="card" style={{ position: 'relative', overflow: 'hidden', borderRadius: 'var(--r-lg)', aspectRatio: '16 / 9', marginBottom: 16 }}>
              <PPhoto kind="navy" slot="caco-video" placeholder="Arraste o vídeo/capa do Caco" style={{ position: 'absolute', inset: 0 }} />
              <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', pointerEvents: 'none' }}>
                <div style={{ width: 58, height: 58, borderRadius: '50%', background: 'rgba(255,255,255,.2)', backdropFilter: 'blur(6px)', border: '1.5px solid rgba(255,255,255,.75)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
                  <PIcon name="play" size={24} stroke="#fff" style={{ marginLeft: 3 }} />
                </div>
              </div>
              <span className="chip-gold" style={{ position: 'absolute', top: 10, left: 10, fontSize: 11, padding: '4px 10px', borderRadius: 8 }}>▶ Conheça o Caco</span>
            </div>
            <div className="h2">Oi! Eu sou o Caco 👋</div>
            <p className="muted" style={{ fontSize: 14, lineHeight: 1.55, margin: '8px auto 0', maxWidth: 270 }}>
              Consultor da Porceville. Me conta o que você precisa — eu te indico a peça certa e monto seu orçamento.
            </p>
          </div>
        )}

        {app.caco.map(m => (
          <div key={m.id} className="fade-in" style={{ display: 'flex', justifyContent: m.role === 'user' ? 'flex-end' : 'flex-start', marginBottom: 12 }}>
            <div style={{ maxWidth: '84%' }}>
              <div style={{
                padding: '11px 14px', borderRadius: m.role === 'user' ? '18px 18px 4px 18px' : '18px 18px 18px 4px',
                background: m.role === 'user' ? 'var(--navy)' : 'var(--surface)',
                color: m.role === 'user' ? '#fff' : 'var(--ink)',
                fontSize: 14.5, lineHeight: 1.5, boxShadow: m.role === 'user' ? 'none' : 'var(--sh-card)',
                whiteSpace: 'pre-wrap',
              }}>{m.text}</div>
              {m.product && <CacoProductCard id={m.product} app={app} />}
            </div>
          </div>
        ))}

        {typing && (
          <div style={{ display: 'flex', marginBottom: 12 }}>
            <div style={{ padding: '14px 16px', borderRadius: '18px 18px 18px 4px', background: 'var(--surface)', boxShadow: 'var(--sh-card)', display: 'flex', gap: 5 }}>
              {[0, 1, 2].map(i => <span key={i} style={{ width: 7, height: 7, borderRadius: '50%', background: 'var(--ink-mute)', animation: `cacoBounce 1.2s ${i * 0.15}s infinite` }} />)}
            </div>
          </div>
        )}
      </div>

      {/* sugestões */}
      {app.caco.length < 2 && (
        <div style={{ display: 'flex', gap: 8, padding: '0 16px 10px', overflowX: 'auto' }}>
          {CACO_SUGGEST.map(s => (
            <button key={s} className="chip" onClick={() => send(s)} style={{ flex: 'none', border: '1px solid var(--line)', background: 'var(--surface)' }}>{s}</button>
          ))}
        </div>
      )}

      {/* input */}
      <div style={{ padding: '8px 14px 30px', background: 'var(--surface)', borderTop: '1px solid var(--line)', display: 'flex', alignItems: 'center', gap: 10 }}>
        <div style={{ flex: 1, display: 'flex', alignItems: 'center', background: 'var(--porc-2)', borderRadius: 22, padding: '4px 6px 4px 16px' }}>
          <input value={draft} onChange={e => setDraft(e.target.value)} onKeyDown={e => e.key === 'Enter' && send(draft)}
            placeholder="Escreva pro Caco…" style={{ flex: 1, border: 'none', background: 'none', outline: 'none', fontSize: 15, fontFamily: 'var(--font-body)', color: 'var(--ink)', padding: '8px 0' }} />
        </div>
        <button onClick={() => send(draft)} style={{ width: 44, height: 44, borderRadius: '50%', border: 'none', background: 'var(--navy)', color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', flex: 'none' }}>
          <PIcon name="send" size={20} stroke="#fff" />
        </button>
      </div>
      <style>{`@keyframes cacoBounce{0%,60%,100%{transform:translateY(0);opacity:.4}30%{transform:translateY(-5px);opacity:1}}`}</style>
    </div>
  );
}

Object.assign(window, { CacoScreen });
