const { useState, useEffect, useMemo } = React;

const CONFIG_KEY = 'codebraz_config_v2';
const ADMIN_PASSWORD = 'codebraz2025';

const PROVIDERS = {
  anthropic: {
    label: 'Anthropic · Claude',
    blurb: 'Modelo padrão do CodeBraz. Excelente em português, contexto longo, ferramentas.',
    models: ['claude-haiku-4-5', 'claude-sonnet-4-5', 'claude-opus-4-5'],
    keyHint: 'sk-ant-...',
    docs: 'https://console.anthropic.com',
    color: '#D97757',
  },
  openai: {
    label: 'OpenAI · GPT',
    blurb: 'Alternativa popular, ampla comunidade, integrações maduras.',
    models: ['gpt-4o-mini', 'gpt-4o', 'gpt-4.1', 'gpt-4.1-mini'],
    keyHint: 'sk-...',
    docs: 'https://platform.openai.com',
    color: '#10A37F',
  },
  google: {
    label: 'Google · Gemini',
    blurb: 'Ótimo para multimodal e custo baixo em volume.',
    models: ['gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-1.5-pro'],
    keyHint: 'AIza...',
    docs: 'https://aistudio.google.com',
    color: '#4285F4',
  },
};

const DEFAULT_CONFIG = {
  activeProvider: 'anthropic',
  // Per-provider settings
  providers: {
    anthropic: { model: 'claude-haiku-4-5' },
    openai: { model: 'gpt-4o-mini' },
    google: { model: 'gemini-2.5-flash' },
  },
  systemPrompt: 'Você é a assistente automatizada da empresa. Atende clientes pelo WhatsApp 24h. Tom: cordial, breve, brasileiro, profissional. Sempre confirme valor, frete e prazo. Feche pedidos com Pix.',
  toneOfVoice: 'cordial',
  businessHours: '24/7',
  fallbackMessage: 'Vou transferir para um humano agora mesmo.',
  // Fallback chain — provedores tentados em ordem se o ativo falhar
  fallbackEnabled: true,
  fallbackChain: ['openai', 'google'], // ordem de tentativa após o activeProvider
  fallbackTimeoutMs: 8000,
  // Per-industry prompt overrides — each entry: { systemPrompt, fallbackMessage }
  // If the entry doesn't exist or systemPrompt is empty, falls back to industry's default.
  industryPrompts: {},
  // Smart features
  autoEscalate: true,
  collectLead: true,
  useEmoji: false,
  maxTokens: 400,
  temperature: 0.5,
};

function loadConfig() {
  try {
    const stored = JSON.parse(localStorage.getItem(CONFIG_KEY) || '{}');
    return {
      ...DEFAULT_CONFIG,
      ...stored,
      providers: { ...DEFAULT_CONFIG.providers, ...(stored.providers || {}) },
    };
  } catch (e) {
    return DEFAULT_CONFIG;
  }
}

function saveConfig(cfg) {
  localStorage.setItem(CONFIG_KEY, JSON.stringify(cfg));
}

// ---------------- Login ----------------

function Login({ onAuth }) {
  const [pw, setPw] = useState('');
  const [err, setErr] = useState('');

  const submit = async (e) => {
    e.preventDefault();
    setErr('');
    try {
      const res = await fetch('/api/admin/auth', {
        method: 'POST',
        credentials: 'include',
        headers: { 'content-type': 'application/json' },
        body: JSON.stringify({ password: pw }),
      });
      const data = await res.json();
      if (data.ok) onAuth();
      else setErr(data.error || 'Senha incorreta.');
    } catch {
      setErr('Erro de conexão. Verifique se o servidor está rodando.');
    }
  };

  return (
    <div className="login-shell">
      <form className="login-card" onSubmit={submit}>
        <p className="login-title">Bem vindo de volta ADM</p>
        <input
          className="login-input"
          type="password"
          placeholder="Senha"
          value={pw}
          autoFocus
          onChange={e => { setPw(e.target.value); setErr(''); }}
        />
        {err && <p className="login-error">{err}</p>}
        <button type="submit" className="login-btn">Entrar</button>
      </form>
    </div>
  );
}

// ---------------- Config: Providers ----------------

function ProviderCard({ id, info, cfg, isActive, onActivate, onUpdate, serverStatus }) {
  const pcfg = cfg.providers[id];

  return (
    <div className={`provider-card ${isActive ? 'is-active' : ''}`}>
      <div className="provider-head">
        <div className="provider-dot" style={{ background: info.color }}></div>
        <div className="provider-meta">
          <div className="provider-name">{info.label}</div>
          <div className="provider-blurb">{info.blurb}</div>
        </div>
        <button
          type="button"
          className={`provider-radio ${isActive ? 'is-active' : ''}`}
          onClick={onActivate}
        >
          {isActive ? 'Ativo' : 'Ativar'}
        </button>
      </div>

      <div className="field-row">
        <div className="field" style={{ marginBottom: 0 }}>
          <label className="field-label">Modelo</label>
          <select
            className="field-select"
            value={pcfg.model}
            onChange={e => onUpdate(id, 'model', e.target.value)}
          >
            {info.models.map(m => <option key={m} value={m}>{m}</option>)}
          </select>
        </div>
        <div className="field" style={{ marginBottom: 0 }}>
          <label className="field-label">
            Chave da API <a href={info.docs} target="_blank" rel="noopener" className="provider-doc">como obter →</a>
          </label>
          <div style={{ padding: '8px 12px', background: 'var(--bg)', borderRadius: 'var(--radius)', border: '1px solid var(--line)', fontSize: '13px' }}>
            {serverStatus === true
              ? <span className="fallback-ok">✓ configurada no servidor (.env)</span>
              : serverStatus === false
              ? <span className="fallback-warn">⚠ não encontrada no .env do servidor</span>
              : <span style={{ color: 'var(--fg-muted)' }}>verificando…</span>}
          </div>
        </div>
      </div>
    </div>
  );
}

function ConfigPanel() {
  const [cfg, setCfg] = useState(loadConfig);
  const [saved, setSaved] = useState(loadConfig);
  const [providerStatus, setProviderStatus] = useState({});
  const dirty = JSON.stringify(cfg) !== JSON.stringify(saved);

  useEffect(() => {
    fetch('/api/admin/provider-status', { credentials: 'include' })
      .then(r => r.ok ? r.json() : {})
      .then(setProviderStatus)
      .catch(() => {});
  }, []);

  const update = (k, v) => setCfg(c => ({ ...c, [k]: v }));
  const updateProvider = (id, k, v) => setCfg(c => ({
    ...c,
    providers: { ...c.providers, [id]: { ...c.providers[id], [k]: v } },
  }));
  const setActive = (id) => update('activeProvider', id);

  const handleSave = () => {
    saveConfig(cfg);
    setSaved(cfg);
  };

  return (
    <div className="admin-section">
      <div className="config-card">
        <div className="admin-h">Provedores de IA</div>
        <p className="admin-sub">Configure quantos provedores quiser. O <b>ativo</b> é quem responde nas conversas.</p>
        <div className="provider-stack">
          {Object.entries(PROVIDERS).map(([id, info]) => (
            <ProviderCard
              key={id}
              id={id}
              info={info}
              cfg={cfg}
              isActive={cfg.activeProvider === id}
              onActivate={() => setActive(id)}
              onUpdate={updateProvider}
              serverStatus={providerStatus[id]}
            />
          ))}
        </div>
        <p className="field-hint" style={{ marginTop: 16 }}>
          As chaves ficam no <code>.env</code> do servidor — nunca expostas ao browser.
        </p>
      </div>

      <div className="config-card">
        <div className="admin-h">Cascata de fallback</div>
        <p className="admin-sub">
          Se o provedor ativo falhar (erro, timeout, sem chave), o sistema tenta automaticamente o próximo da fila.
          Garante que o cliente <b>nunca</b> fica sem resposta.
        </p>
        <Toggle
          label="Ativar fallback automático"
          hint="Quando ligado, falhas são silenciosamente recuperadas pelos próximos provedores."
          checked={cfg.fallbackEnabled}
          onChange={v => update('fallbackEnabled', v)}
        />
        {cfg.fallbackEnabled && (
          <FallbackChain
            active={cfg.activeProvider}
            chain={cfg.fallbackChain}
            providerStatus={providerStatus}
            onChange={(newChain) => update('fallbackChain', newChain)}
          />
        )}
        <div className="field" style={{ marginTop: 16, marginBottom: 0 }}>
          <label className="field-label">Timeout antes de tentar próximo · {(cfg.fallbackTimeoutMs / 1000).toFixed(1)}s</label>
          <input
            type="range" min="2000" max="20000" step="500"
            value={cfg.fallbackTimeoutMs}
            onChange={e => update('fallbackTimeoutMs', parseInt(e.target.value, 10))}
            className="field-range"
          />
          <p className="field-hint">Se a resposta demorar mais que isso, considera falha e pula para o próximo.</p>
        </div>
      </div>

      <div className="config-card">
        <div className="admin-h">Prompt por setor</div>
        <p className="admin-sub">
          Cada ramo de empresa tem regras, vocabulário e prioridades diferentes — uma clínica não atende como uma oficina.
          Edite o prompt de cada setor que você atende.
        </p>
        <IndustryPromptsEditor
          overrides={cfg.industryPrompts}
          onChange={(id, patch) => {
            setCfg(c => ({
              ...c,
              industryPrompts: {
                ...c.industryPrompts,
                [id]: { ...(c.industryPrompts[id] || {}), ...patch },
              },
            }));
          }}
          onReset={(id) => {
            setCfg(c => {
              const next = { ...c.industryPrompts };
              delete next[id];
              return { ...c, industryPrompts: next };
            });
          }}
        />
      </div>

      <div className="config-card">
        <div className="admin-h">Padrões globais</div>
        <p className="admin-sub">Aplicados a todos os setores se não houver sobrescrita específica.</p>
        <div className="field-row">
          <div className="field">
            <label className="field-label">Tom de voz</label>
            <select className="field-select" value={cfg.toneOfVoice} onChange={e => update('toneOfVoice', e.target.value)}>
              <option value="cordial">Cordial</option>
              <option value="descontraido">Descontraído</option>
              <option value="formal">Formal</option>
              <option value="tecnico">Técnico</option>
            </select>
          </div>
          <div className="field">
            <label className="field-label">Horário de atendimento</label>
            <select className="field-select" value={cfg.businessHours} onChange={e => update('businessHours', e.target.value)}>
              <option value="24/7">24h, todos os dias</option>
              <option value="comercial">Horário comercial (8h–18h)</option>
              <option value="estendido">Estendido (8h–22h)</option>
            </select>
          </div>
        </div>
        <div className="field">
          <label className="field-label">Mensagem de fallback (quando não souber responder)</label>
          <input
            className="field-input"
            value={cfg.fallbackMessage}
            onChange={e => update('fallbackMessage', e.target.value)}
          />
        </div>

        <div className="field-row">
          <div className="field">
            <label className="field-label">Temperatura · {cfg.temperature.toFixed(1)}</label>
            <input
              type="range" min="0" max="1" step="0.1"
              value={cfg.temperature}
              onChange={e => update('temperature', parseFloat(e.target.value))}
              className="field-range"
            />
            <p className="field-hint">0 = previsível · 1 = criativo.</p>
          </div>
          <div className="field">
            <label className="field-label">Tokens máx. por resposta</label>
            <input
              type="number" min="50" max="2000" step="50"
              className="field-input"
              value={cfg.maxTokens}
              onChange={e => update('maxTokens', parseInt(e.target.value, 10) || 400)}
            />
          </div>
        </div>
      </div>

      <div className="config-card">
        <div className="admin-h">Recursos inteligentes</div>
        <Toggle
          label="Escalar para humano automaticamente"
          hint="Se o cliente pedir “falar com pessoa”, transfere imediatamente."
          checked={cfg.autoEscalate}
          onChange={v => update('autoEscalate', v)}
        />
        <Toggle
          label="Capturar lead (nome + telefone)"
          hint="Pede dados antes de fechar pedido — cria registro no CRM."
          checked={cfg.collectLead}
          onChange={v => update('collectLead', v)}
        />
        <Toggle
          label="Permitir emojis"
          hint="Use com cautela: melhor desligado para B2B/serviços."
          checked={cfg.useEmoji}
          onChange={v => update('useEmoji', v)}
        />
      </div>

      <div className={`save-bar ${dirty ? 'is-dirty' : ''}`}>
        <span className={`save-status ${dirty ? 'is-dirty' : ''}`}>
          {dirty ? '● Alterações não salvas' : '✓ Tudo salvo'}
        </span>
        <button className="save-btn" disabled={!dirty} onClick={handleSave}>
          Salvar configuração
        </button>
      </div>
    </div>
  );
}

function FallbackChain({ active, chain, providerStatus = {}, onChange }) {
  // Build full ordered list: [active, ...chain] but only show providers configured
  const otherIds = Object.keys(PROVIDERS).filter(id => id !== active);
  // Ensure chain only contains valid otherIds, and includes all of them
  const safeChain = otherIds.sort((a, b) => {
    const ia = chain.indexOf(a); const ib = chain.indexOf(b);
    if (ia === -1 && ib === -1) return 0;
    if (ia === -1) return 1;
    if (ib === -1) return -1;
    return ia - ib;
  });

  const move = (idx, dir) => {
    const next = [...safeChain];
    const newIdx = idx + dir;
    if (newIdx < 0 || newIdx >= next.length) return;
    [next[idx], next[newIdx]] = [next[newIdx], next[idx]];
    onChange(next);
  };

  return (
    <div className="fallback-chain">
      <div className="fallback-step is-primary">
        <div className="fallback-rank">1º</div>
        <div className="fallback-info">
          <div className="fallback-dot" style={{ background: PROVIDERS[active].color }}></div>
          <div>
            <div className="fallback-name">{PROVIDERS[active].label}</div>
            <div className="fallback-role">Principal · responde primeiro</div>
          </div>
        </div>
        <div className="fallback-status">
          {providerStatus[active] ? <span className="fallback-ok">✓ chave</span> : <span className="fallback-warn">sem chave .env</span>}
        </div>
      </div>
      {safeChain.map((id, i) => (
        <div key={id} className="fallback-step">
          <div className="fallback-rank">{i + 2}º</div>
          <div className="fallback-info">
            <div className="fallback-dot" style={{ background: PROVIDERS[id].color }}></div>
            <div>
              <div className="fallback-name">{PROVIDERS[id].label}</div>
              <div className="fallback-role">Fallback · tenta se o anterior falhar</div>
            </div>
          </div>
          <div className="fallback-status">
            {providerStatus[id] ? <span className="fallback-ok">✓ chave</span> : <span className="fallback-warn">sem chave .env</span>}
            <div className="fallback-reorder">
              <button type="button" className="reorder-btn" onClick={() => move(i, -1)} disabled={i === 0} title="Subir">▲</button>
              <button type="button" className="reorder-btn" onClick={() => move(i, +1)} disabled={i === safeChain.length - 1} title="Descer">▼</button>
            </div>
          </div>
        </div>
      ))}
      <div className="fallback-arrow-stack" aria-hidden="true">
        {safeChain.map((_, i) => <div key={i} className="fallback-arrow">↓</div>)}
      </div>
    </div>
  );
}

function IndustryPromptsEditor({ overrides, onChange, onReset }) {
  const [openId, setOpenId] = React.useState(null);
  const industries = window.INDUSTRIES || [];
  if (industries.length === 0) {
    return <div className="empty-state">Nenhum setor carregado.</div>;
  }
  return (
    <div className="industry-prompts">
      {industries.map(ind => {
        const ovr = overrides[ind.id] || {};
        const customPrompt = ovr.systemPrompt && ovr.systemPrompt !== ind.systemPrompt;
        const isOpen = openId === ind.id;
        const value = ovr.systemPrompt ?? ind.systemPrompt;
        return (
          <div key={ind.id} className={`industry-prompt ${isOpen ? 'is-open' : ''} ${customPrompt ? 'is-custom' : ''}`}>
            <button
              type="button"
              className="industry-prompt-head"
              onClick={() => setOpenId(isOpen ? null : ind.id)}
            >
              <div className="industry-prompt-code">{ind.code}</div>
              <div className="industry-prompt-meta">
                <div className="industry-prompt-name">
                  {ind.label} · <span className="industry-prompt-bot">{ind.bot}</span>
                </div>
                <div className="industry-prompt-status">
                  {customPrompt ? <span className="badge-custom">personalizado</span> : <span className="badge-default">prompt padrão</span>}
                  <span className="industry-prompt-len">{value.length} chars</span>
                </div>
              </div>
              <span className="industry-prompt-chev">{isOpen ? '▾' : '▸'}</span>
            </button>
            {isOpen && (
              <div className="industry-prompt-body">
                <label className="field-label" style={{ marginBottom: 6, display: 'block' }}>Prompt do sistema · {ind.label}</label>
                <textarea
                  className="field-textarea"
                  rows={8}
                  value={value}
                  onChange={e => onChange(ind.id, { systemPrompt: e.target.value })}
                />
                <p className="field-hint">
                  Inclua: identidade, produtos/serviços com preços, regras (frete, prazo, pagamento, agenda),
                  horário, restrições. Quanto mais específico, melhor.
                </p>
                <div className="field-row" style={{ marginTop: 12 }}>
                  <div className="field" style={{ marginBottom: 0 }}>
                    <label className="field-label">Mensagem de fallback (deste setor)</label>
                    <input
                      className="field-input"
                      placeholder="Vazio = usa o padrão global"
                      value={ovr.fallbackMessage || ''}
                      onChange={e => onChange(ind.id, { fallbackMessage: e.target.value })}
                    />
                  </div>
                  <div className="field" style={{ marginBottom: 0, alignSelf: 'end' }}>
                    {customPrompt && (
                      <button type="button" className="ghost-btn" onClick={() => onReset(ind.id)}>
                        ↺ Restaurar padrão
                      </button>
                    )}
                  </div>
                </div>
              </div>
            )}
          </div>
        );
      })}
    </div>
  );
}

function Toggle({ label, hint, checked, onChange }) {  return (
    <label className="toggle-row">
      <div>
        <div className="toggle-label">{label}</div>
        <div className="toggle-hint">{hint}</div>
      </div>
      <button
        type="button"
        role="switch"
        aria-checked={checked}
        className={`toggle-switch ${checked ? 'is-on' : ''}`}
        onClick={() => onChange(!checked)}
      >
        <span className="toggle-knob"></span>
      </button>
    </label>
  );
}

// ---------------- Metrics tab ----------------

const TYPE_LABELS = {
  page_view: 'Visualização',
  click: 'Clique',
  demo_setor: 'Setor testado',
  demo_user_msg: 'Mensagem do visitante',
  demo_ai_reply: 'Resposta IA',
  scroll_depth: 'Scroll',
};

const SECTOR_LABELS = {
  restaurante: 'Restaurante / Delivery',
  clinica: 'Clínica / Saúde',
  imobiliaria: 'Imobiliária',
  ecommerce: 'E-commerce / Moda',
  beleza: 'Beleza / Estética',
  academia: 'Academia / Fitness',
  pousada: 'Pousada / Turismo',
  oficina: 'Oficina / Auto',
};

const PLAN_LABELS = {
  plano_start: 'Plano Start',
  plano_pro: 'Plano Pro',
  plano_scale: 'Plano Scale',
  hero_ver_planos: 'CTA · Ver planos',
  hero_testar_ia: 'CTA · Testar a IA',
};

function MetricsPanel() {
  const [tick, setTick] = useState(0);
  const [range, setRange] = useState('all'); // all | today | 7d
  useEffect(() => {
    const t = setInterval(() => setTick(x => x + 1), 5000);
    return () => clearInterval(t);
  }, []);

  const allEvents = useMemo(() => window.CBTrack.readEvents(), [tick]);

  const events = useMemo(() => {
    if (range === 'all') return allEvents;
    const now = Date.now();
    const cutoff = range === 'today'
      ? new Date().setHours(0, 0, 0, 0)
      : now - 7 * 24 * 60 * 60 * 1000;
    return allEvents.filter(e => e.ts >= cutoff);
  }, [allEvents, range]);

  const sessions = useMemo(() => new Set(events.map(e => e.session)).size, [events]);

  const totals = useMemo(() => {
    const r = { page_view: 0, click: 0, demo_setor: 0, demo_user_msg: 0, demo_ai_reply: 0, scroll_depth: 0 };
    events.forEach(e => { if (r[e.type] !== undefined) r[e.type]++; });
    return r;
  }, [events]);

  // Conversion funnel
  const funnel = useMemo(() => {
    const sessionStages = {};
    events.forEach(e => {
      const s = e.session;
      if (!sessionStages[s]) sessionStages[s] = { view: false, demo: false, msg: false, plan: false };
      if (e.type === 'page_view') sessionStages[s].view = true;
      if (e.type === 'demo_setor') sessionStages[s].demo = true;
      if (e.type === 'demo_user_msg') sessionStages[s].msg = true;
      if (e.type === 'click' && e.payload.label && e.payload.label.startsWith('plano_')) sessionStages[s].plan = true;
    });
    const all = Object.values(sessionStages);
    const total = all.length || 1;
    return {
      view: all.filter(s => s.view).length,
      demo: all.filter(s => s.demo).length,
      msg: all.filter(s => s.msg).length,
      plan: all.filter(s => s.plan).length,
      total,
    };
  }, [events]);

  // Sector ranking
  const sectorCounts = useMemo(() => {
    const c = {};
    events.filter(e => e.type === 'demo_setor').forEach(e => {
      const id = e.payload.id;
      c[id] = (c[id] || 0) + 1;
    });
    return c;
  }, [events]);
  const sectorMax = Math.max(1, ...Object.values(sectorCounts));

  // Plan ranking — only plan_* events
  const planCounts = useMemo(() => {
    const c = {};
    events.filter(e => e.type === 'click' && e.payload.label && e.payload.label.startsWith('plano_')).forEach(e => {
      c[e.payload.label] = (c[e.payload.label] || 0) + 1;
    });
    return c;
  }, [events]);
  const planMax = Math.max(1, ...Object.values(planCounts));
  const planEntries = Object.entries(planCounts).sort((a, b) => b[1] - a[1]);

  // CTA ranking (everything else)
  const ctaCounts = useMemo(() => {
    const c = {};
    events.filter(e => e.type === 'click').forEach(e => {
      const lbl = e.payload.label || '—';
      if (lbl.startsWith('plano_')) return;
      c[lbl] = (c[lbl] || 0) + 1;
    });
    return c;
  }, [events]);
  const ctaMax = Math.max(1, ...Object.values(ctaCounts));
  const ctaEntries = Object.entries(ctaCounts).sort((a, b) => b[1] - a[1]).slice(0, 6);

  // Hour histogram
  const hourCounts = useMemo(() => {
    const h = Array(24).fill(0);
    events.forEach(e => { h[new Date(e.ts).getHours()]++; });
    return h;
  }, [events]);
  const hourMax = Math.max(1, ...hourCounts);

  // AI conversation stats
  const aiStats = useMemo(() => {
    const userMsgs = events.filter(e => e.type === 'demo_user_msg');
    const replies = events.filter(e => e.type === 'demo_ai_reply');
    const avgLen = userMsgs.length
      ? Math.round(userMsgs.reduce((sum, e) => sum + (e.payload.len || 0), 0) / userMsgs.length)
      : 0;
    const sessionsWithChat = new Set(userMsgs.map(e => e.session)).size;
    const replyRate = userMsgs.length ? Math.round((replies.length / userMsgs.length) * 100) : 0;
    return { userMsgs: userMsgs.length, replies: replies.length, avgLen, sessionsWithChat, replyRate };
  }, [events]);

  const recent = events.slice(-50).reverse();

  const handleClear = () => {
    if (confirm('Apagar todos os eventos?')) {
      window.CBTrack.clearEvents();
      setTick(t => t + 1);
    }
  };

  const exportJSON = () => {
    const blob = new Blob([JSON.stringify(allEvents, null, 2)], { type: 'application/json' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = `codebraz-events-${new Date().toISOString().slice(0,10)}.json`;
    a.click();
    URL.revokeObjectURL(url);
  };

  if (allEvents.length === 0) {
    return (
      <div className="empty-state">
        Nenhum evento registrado ainda.<br/>
        Abra a <a href="index.html" style={{color:'var(--green)'}}>página principal</a> e interaja para gerar dados.
      </div>
    );
  }

  return (
    <div className="admin-section">
      <div className="metrics-toolbar">
        <div className="range-tabs">
          <button className={`range-tab ${range === 'all' ? 'is-active' : ''}`} onClick={() => setRange('all')}>Tudo</button>
          <button className={`range-tab ${range === '7d' ? 'is-active' : ''}`} onClick={() => setRange('7d')}>7 dias</button>
          <button className={`range-tab ${range === 'today' ? 'is-active' : ''}`} onClick={() => setRange('today')}>Hoje</button>
        </div>
        <div className="toolbar-actions">
          <button className="ghost-btn" onClick={exportJSON}>Exportar JSON</button>
          <button className="danger-btn" onClick={handleClear}>Limpar dados</button>
        </div>
      </div>

      <div className="kpi-grid">
        <div className="kpi">
          <div className="kpi-label">Sessões</div>
          <div className="kpi-value">{sessions}</div>
          <div className="kpi-delta">visitantes únicos</div>
        </div>
        <div className="kpi">
          <div className="kpi-label">Visualizações</div>
          <div className="kpi-value">{totals.page_view}</div>
          <div className="kpi-delta">page views totais</div>
        </div>
        <div className="kpi kpi-accent">
          <div className="kpi-label">Conversão pra demo</div>
          <div className="kpi-value">{funnel.total ? Math.round((funnel.demo / funnel.total) * 100) : 0}<span className="kpi-unit">%</span></div>
          <div className="kpi-delta">{funnel.demo} de {funnel.total} sessões testaram a IA</div>
        </div>
        <div className="kpi kpi-accent">
          <div className="kpi-label">Conversão pra plano</div>
          <div className="kpi-value">{funnel.total ? Math.round((funnel.plan / funnel.total) * 100) : 0}<span className="kpi-unit">%</span></div>
          <div className="kpi-delta">{funnel.plan} cliques em planos</div>
        </div>
      </div>

      {/* Funnel */}
      <div className="panel">
        <h3 className="panel-title">Funil de conversão</h3>
        <p className="panel-sub">Jornada da sessão · cada barra mostra % das sessões que chegaram a cada passo.</p>
        <FunnelBars funnel={funnel} />
      </div>

      <div className="dash-grid">
        <div className="panel">
          <h3 className="panel-title">Indústrias mais testadas</h3>
          <p className="panel-sub">Onde os visitantes querem ver a IA trabalhando.</p>
          {Object.keys(sectorCounts).length === 0 ? (
            <div className="empty-state">Nenhum setor testado ainda.</div>
          ) : (
            Object.entries(sectorCounts)
              .sort((a, b) => b[1] - a[1])
              .map(([id, n]) => (
                <div key={id} className="bar-row">
                  <div className="bar-label">{SECTOR_LABELS[id] || id}</div>
                  <div className="bar-track">
                    <div className="bar-fill" style={{ width: `${(n / sectorMax) * 100}%` }}></div>
                  </div>
                  <div className="bar-value">{n}</div>
                </div>
              ))
          )}
        </div>

        <div className="panel">
          <h3 className="panel-title">Plano mais clicado</h3>
          <p className="panel-sub">Sinal de intenção de compra.</p>
          {planEntries.length === 0 ? (
            <div className="empty-state">Nenhum clique em plano ainda.</div>
          ) : (
            planEntries.map(([lbl, n]) => (
              <div key={lbl} className="bar-row">
                <div className="bar-label">{PLAN_LABELS[lbl] || lbl}</div>
                <div className="bar-track">
                  <div className="bar-fill bar-fill-warm" style={{ width: `${(n / planMax) * 100}%` }}></div>
                </div>
                <div className="bar-value">{n}</div>
              </div>
            ))
          )}
        </div>
      </div>

      <div className="dash-grid">
        <div className="panel">
          <h3 className="panel-title">Conversa com IA — uso real</h3>
          <p className="panel-sub">Quando o visitante continua a conversa após o script, vai por aqui.</p>
          <div className="mini-grid">
            <Mini label="Sessões que conversaram" value={aiStats.sessionsWithChat} />
            <Mini label="Mensagens enviadas" value={aiStats.userMsgs} />
            <Mini label="Respostas geradas" value={aiStats.replies} />
            <Mini label="Tamanho médio (chars)" value={aiStats.avgLen} />
          </div>
          <div className="reply-rate">
            <div className="reply-rate-bar">
              <div className="reply-rate-fill" style={{ width: `${aiStats.replyRate}%` }}></div>
            </div>
            <div className="reply-rate-label">
              <b>{aiStats.replyRate}%</b> taxa de resposta da IA
            </div>
          </div>
        </div>

        <div className="panel">
          <h3 className="panel-title">CTAs (fora dos planos)</h3>
          <p className="panel-sub">Outros cliques rastreados.</p>
          {ctaEntries.length === 0 ? (
            <div className="empty-state">Sem cliques ainda.</div>
          ) : (
            ctaEntries.map(([lbl, n]) => (
              <div key={lbl} className="bar-row">
                <div className="bar-label" title={lbl}>{PLAN_LABELS[lbl] || lbl}</div>
                <div className="bar-track">
                  <div className="bar-fill bar-fill-cool" style={{ width: `${(n / ctaMax) * 100}%` }}></div>
                </div>
                <div className="bar-value">{n}</div>
              </div>
            ))
          )}
        </div>
      </div>

      <div className="panel">
        <h3 className="panel-title">Atividade por hora</h3>
        <p className="panel-sub">Distribuição de eventos ao longo do dia (hora local).</p>
        <div className="hours">
          {hourCounts.map((n, i) => (
            <div
              key={i}
              className={`hours-bar ${n === 0 ? 'hours-bar-empty' : ''}`}
              style={{ height: n === 0 ? '4px' : `${(n / hourMax) * 100}%` }}
              title={`${i}h — ${n} eventos`}
            ></div>
          ))}
        </div>
        <div className="hours-axis">
          {Array.from({length: 24}, (_, i) => <span key={i}>{i.toString().padStart(2,'0')}h</span>)}
        </div>
      </div>

      <div className="panel">
        <div style={{display:'flex', justifyContent:'space-between', alignItems:'flex-start', marginBottom:'16px'}}>
          <div>
            <h3 className="panel-title">Log recente</h3>
            <p className="panel-sub">Últimos {recent.length} eventos.</p>
          </div>
        </div>
        <div className="event-log">
          {recent.map((e, i) => (
            <div key={i} className="event-row">
              <span className="event-time">{new Date(e.ts).toLocaleTimeString('pt-BR')}</span>
              <span className={`event-type t-${e.type}`}>{TYPE_LABELS[e.type] || e.type}</span>
              <span className="event-payload">
                {e.type === 'click' && (PLAN_LABELS[e.payload.label] || e.payload.label)}
                {e.type === 'demo_setor' && (SECTOR_LABELS[e.payload.id] || e.payload.id)}
                {e.type === 'demo_user_msg' && `“${e.payload.label}” · turn ${e.payload.turn}`}
                {e.type === 'demo_ai_reply' && (SECTOR_LABELS[e.payload.id] || e.payload.id)}
                {e.type === 'scroll_depth' && `${e.payload.depth}%`}
                {e.type === 'page_view' && (e.payload.ref || 'direct')}
              </span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

function Mini({ label, value }) {
  return (
    <div className="mini">
      <div className="mini-value">{value}</div>
      <div className="mini-label">{label}</div>
    </div>
  );
}

function FunnelBars({ funnel }) {
  const steps = [
    { key: 'view', label: 'Viu a página', val: funnel.view, color: 'oklch(0.55 0.04 240)' },
    { key: 'demo', label: 'Trocou setor da demo', val: funnel.demo, color: 'oklch(0.6 0.12 200)' },
    { key: 'msg', label: 'Conversou com a IA', val: funnel.msg, color: 'oklch(0.7 0.18 150)' },
    { key: 'plan', label: 'Clicou em plano', val: funnel.plan, color: 'oklch(0.78 0.17 80)' },
  ];
  const max = funnel.total || 1;
  return (
    <div className="funnel">
      {steps.map((s, i) => {
        const pct = (s.val / max) * 100;
        const fromPrev = i > 0 ? (steps[i-1].val ? Math.round((s.val / steps[i-1].val) * 100) : 0) : 100;
        return (
          <div key={s.key} className="funnel-step">
            <div className="funnel-meta">
              <span className="funnel-label">{s.label}</span>
              <span className="funnel-counts">
                <b>{s.val}</b>
                <span className="funnel-pct">{Math.round(pct)}%</span>
                {i > 0 && <span className="funnel-step-pct">↳ {fromPrev}% do passo anterior</span>}
              </span>
            </div>
            <div className="funnel-track">
              <div className="funnel-fill" style={{ width: `${pct}%`, background: s.color }}></div>
            </div>
          </div>
        );
      })}
    </div>
  );
}

// ---------------- Shell ----------------

function AdminShell() {
  const [tab, setTab] = useState('metrics');
  const cfg = loadConfig();
  const activeProvider = PROVIDERS[cfg.activeProvider];

  return (
    <div className="admin-shell">
      <div className="admin-top">
        <div className="admin-brand">
          <div className="admin-brand-mark">CB</div>
          <div>code<b>braz</b> · admin</div>
        </div>
        <div className="admin-top-right">
          <span className="admin-pill admin-pill-provider" title="Provedor ativo">
            <span className="admin-pill-dot" style={{ background: activeProvider.color }}></span>
            {activeProvider.label.split(' · ')[1] || activeProvider.label}
          </span>
          <span className="admin-pill">{new Date().toLocaleDateString('pt-BR')}</span>
          <a href="index.html" className="admin-pill admin-pill-link">← site</a>
          <button
            className="admin-pill admin-pill-link"
            style={{cursor:'pointer', background:'transparent', font:'inherit', border:'1px solid var(--line)'}}
            onClick={() => fetch('/api/admin/logout', { method: 'POST', credentials: 'include' }).finally(() => location.reload())}
          >
            sair
          </button>
        </div>
      </div>

      <div className="admin-tabs">
        <button className={`admin-tab ${tab === 'metrics' ? 'is-active' : ''}`} onClick={() => setTab('metrics')}>
          Métricas
        </button>
        <button className={`admin-tab ${tab === 'config' ? 'is-active' : ''}`} onClick={() => setTab('config')}>
          Configuração da IA
        </button>
      </div>

      {tab === 'metrics' && <MetricsPanel />}
      {tab === 'config' && <ConfigPanel />}
    </div>
  );
}

function App() {
  const [authed, setAuthed] = useState(false);
  const [checking, setChecking] = useState(true);

  useEffect(() => {
    fetch('/api/admin/verify', { credentials: 'include' })
      .then(r => r.ok ? r.json() : Promise.reject())
      .then(d => { if (d.ok) setAuthed(true); })
      .catch(() => {})
      .finally(() => setChecking(false));
  }, []);

  if (checking) return null;
  if (!authed) return <Login onAuth={() => setAuthed(true)} />;
  return <AdminShell />;
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
