/* global React, SEQ_UI, SEQ_DATA */
const { Wordmark, Avatar, TempPill, StatusChip, Icon, brl, fmtDur } = window.SEQ_UI;
const { PROPOSTAS: PROPOSTAS_FALLBACK } = window.SEQ_DATA;

// Lê id do hash query (#/proposta?id=xxx) ou pega a primeira da lista.
function getProposalId() {
  const h = window.location.hash || "";
  const q = h.split("?")[1];
  if (!q) return null;
  return new URLSearchParams(q).get("id");
}

function transformProposalDetail(api) {
  const sentAt = api.sentAt;
  const statusMap = { accepted: "aceita", viewed: "viewing", sent: "sent", rejected: "rejeitada", expired: "expirada", draft: "rascunho" };
  const tempMap = { hot: "quente", warm: "morno", cold: "frio", fervendo: "fervendo" };
  return {
    id: api.id,
    title: api.title,
    intro: api.intro || "",
    cliente: api.client?.name || "—",
    empresa: api.client?.company || "—",
    avatar: (api.client?.name || "—").split(" ").map(s=>s[0]).slice(0,2).join(""),
    email: api.client?.email || "",
    phone: api.client?.phone || "",
    valor: (api.totalAmount ?? 0) / 100,
    valorCents: api.totalAmount ?? 0,
    pagamento: api.paymentTerms || "Único",
    status: statusMap[api.status] || api.status,
    tempo: tempMap[api.temperature] || "frio",
    enviadaEm: sentAt ? new Date(sentAt).toLocaleString("pt-BR") : "rascunho",
    enviadaEmISO: sentAt,
    aceitaEmISO: api.acceptedAt,
    visualizacoes: api.viewCount ?? 0,
    tempoTotalSeg: api.totalViewSeconds ?? 0,
    iaScore: api.aiScore ?? 0,
    iaLabel: api.aiLabel || "Sem sinal",
    iaInsight: api.aiInsight || "",
    link: `pay.kaleidos.com.br/p/${api.publicSlug || api.id}`,
    canais: { email: "—", whatsapp: "—" },
    timeline: [],
    eventos: [],
    insights: [],
  };
}

function parseDevice(ua) {
  if (!ua) return "—";
  if (/iPad/i.test(ua)) return "iPad";
  if (/iPhone/i.test(ua)) return "iPhone";
  if (/Android/i.test(ua)) return /Mobile/i.test(ua) ? "Android" : "Android tablet";
  if (/Macintosh/i.test(ua)) return "Mac";
  if (/Windows/i.test(ua)) return "Windows";
  if (/Linux/i.test(ua)) return "Linux";
  if (/Bun\//i.test(ua)) return "Bun (test)";
  if (/curl/i.test(ua)) return "curl";
  return "Web";
}

function fmtDateTime(iso) {
  if (!iso) return "—";
  const d = new Date(iso);
  return d.toLocaleString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
}

function fmtSec(s) {
  if (!s || s < 1) return "0s";
  if (s < 60) return `${s}s`;
  const m = Math.floor(s / 60);
  const r = s % 60;
  return r > 0 ? `${m}min ${r}s` : `${m}min`;
}

function buildLiveTimeline(p, views) {
  const events = [];
  if (p.aceitaEmISO) {
    events.push({ kind: "accept", label: "Proposta aceita!", sub: `Aceita por ${p.cliente}`, date: fmtDateTime(p.aceitaEmISO), live: true });
  }
  // Agrupa views: opens são "âncoras" de sessão; heartbeats subsequentes somam duração
  const sorted = [...views].sort((a, b) => new Date(b.viewedAt).getTime() - new Date(a.viewedAt).getTime());
  let sessionAccum = 0;
  let lastWasOpen = false;
  for (const v of sorted) {
    const dev = parseDevice(v.userAgent);
    if (v.section === "open") {
      events.push({
        kind: "view",
        label: lastWasOpen ? "Cliente reabriu a proposta" : "Cliente abriu a proposta",
        sub: `Sessão ${sessionAccum > 0 ? `· ${fmtSec(sessionAccum)} de leitura · ` : "· "}${dev}${v.ip ? ` · IP ${v.ip}` : ""}`,
        date: fmtDateTime(v.viewedAt),
      });
      sessionAccum = 0;
      lastWasOpen = true;
    } else if (v.section === "heartbeat" || v.section === "blur" || v.section === "unload") {
      sessionAccum += v.durationSeconds || 0;
    }
  }
  if (p.enviadaEmISO) {
    events.push({ kind: "send", label: "Proposta enviada", sub: "Via E-mail + WhatsApp · entregues em segundos", date: fmtDateTime(p.enviadaEmISO) });
  }
  return events;
}

function PropostaDetalhe() {
  const [p, setP] = React.useState(PROPOSTAS_FALLBACK[0]);
  const [views, setViews] = React.useState([]);
  const [tab, setTab] = React.useState("timeline");
  const [copied, setCopied] = React.useState(false);
  const [editOpen, setEditOpen] = React.useState(false);
  const [proposalId, setProposalId] = React.useState(null);

  React.useEffect(() => {
    const id = getProposalId();
    if (id) {
      setProposalId(id);
      window.SEQ_API.getProposal(id)
        .then(d => d?.proposal && setP(transformProposalDetail(d.proposal)))
        .catch(() => {});
      window.SEQ_API.listProposalViews(id)
        .then(d => setViews(d.views || []))
        .catch(() => {});
    } else {
      // Sem id explícito: pega a mais recente do banco
      window.SEQ_API.listProposals()
        .then(d => {
          if (d.proposals?.[0]) {
            const proposal = d.proposals[0];
            setProposalId(proposal.id);
            setP(transformProposalDetail(proposal));
            window.SEQ_API.listProposalViews(proposal.id)
              .then(dd => setViews(dd.views || []))
              .catch(() => {});
          }
        })
        .catch(() => {});
    }
  }, []);

  // Refresh views a cada 30s pra capturar leituras em tempo real
  React.useEffect(() => {
    if (!proposalId) return;
    const id = setInterval(() => {
      window.SEQ_API.listProposalViews(proposalId)
        .then(d => setViews(d.views || []))
        .catch(() => {});
      window.SEQ_API.getProposal(proposalId)
        .then(d => d?.proposal && setP(transformProposalDetail(d.proposal)))
        .catch(() => {});
    }, 30000);
    return () => clearInterval(id);
  }, [proposalId]);

  const liveTimeline = React.useMemo(() => buildLiveTimeline(p, views), [p, views]);
  const liveEventos = React.useMemo(() => views.map(v => ({
    date: fmtDateTime(v.viewedAt),
    action: (v.section || "VIEW").toUpperCase(),
    detail: `${parseDevice(v.userAgent)}${v.durationSeconds ? ` · ${fmtSec(v.durationSeconds)}` : ""}${v.ip ? ` · ${v.ip}` : ""}`,
    weight: v.section === "open" ? 0.7 : 0.4,
  })), [views]);

  const copyLink = () => {
    navigator.clipboard?.writeText("https://" + p.link).catch(()=>{});
    setCopied(true);
    setTimeout(()=>setCopied(false), 1400);
  };

  return (
    <div style={{ minHeight: "100vh", background: "var(--kp-paper)" }}>
      <DetailTopBar p={p} onEdit={() => setEditOpen(true)} />
      <div className="kp-container kp-container-wide" style={{ padding: "24px 32px 64px", maxWidth: 1320 }}>
        <TopRow p={p} copyLink={copyLink} copied={copied} />
        <MetricsRow p={p} />
        <BottomRow p={p} tab={tab} setTab={setTab} liveTimeline={liveTimeline} liveEventos={liveEventos} />
      </div>
      {editOpen && (
        <EditPropostaModal
          p={p}
          onClose={() => setEditOpen(false)}
          onSaved={() => { setEditOpen(false); window.location.reload(); }}
        />
      )}
    </div>
  );
}

// ─── WhatsApp helpers ───────────────────────────────────
function buildWhatsAppLink(p) {
  const phone = (p.phone || "").replace(/\D/g, "");
  if (!phone) return null;
  const firstName = (p.cliente || "").split(" ")[0] || "";
  const link = `https://${p.link}`;
  const valor = p.valor != null
    ? p.valor.toLocaleString("pt-BR", { style: "currency", currency: "BRL" })
    : "";
  const lines = [
    `Oi ${firstName}, tudo bem?`,
    "",
    `Passando aqui pra lembrar da proposta "${p.title}"${valor ? ` (${valor})` : ""}.`,
    "",
    `Quando puder dá uma olhada: ${link}`,
    "",
    "Qualquer dúvida me chama por aqui mesmo. 🙌",
  ];
  return `https://wa.me/${phone}?text=${encodeURIComponent(lines.join("\n"))}`;
}

// ─── Top bar ────────────────────────────────────────────
function DetailTopBar({ p, onEdit }) {
  const waLink = React.useMemo(() => buildWhatsAppLink(p), [p]);
  return (
    <div style={{
      borderBottom: "1.5px solid var(--kp-ink)", background: "var(--kp-paper)",
      position: "sticky", top: 0, zIndex: 30,
    }}>
      <div className="kp-container kp-container-wide" style={{
        display: "flex", alignItems: "center", justifyContent: "space-between",
        padding: "12px 32px", maxWidth: 1320, gap: 16,
      }}>
        <div style={{ display: "flex", alignItems: "center", gap: 16, minWidth: 0 }}>
          <a href="#/propostas" className="kp-btn kp-btn-sm kp-btn-ghost" style={{ padding: "6px 10px" }}>
            <Icon.back s={14} /> Propostas
          </a>
          <span style={{ color: "var(--kp-faint)" }}>|</span>
          <div className="kp-display" style={{ fontSize: 18, lineHeight: 1.1, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
            {p.title}
          </div>
          <StatusChip status={p.status} />
        </div>
        <div style={{ display: "flex", gap: 8 }}>
          {waLink ? (
            <a
              href={waLink}
              target="_blank"
              rel="noopener noreferrer"
              className="kp-btn kp-btn-sm"
              style={{ background: "var(--kp-green)", textDecoration: "none" }}
              title={`Lembrar ${p.cliente} pelo WhatsApp`}
            >
              <Icon.whatsapp s={12} /> Lembrar via WhatsApp
            </a>
          ) : (
            <span
              className="kp-btn kp-btn-sm"
              style={{ opacity: 0.5, cursor: "not-allowed" }}
              title="Cliente sem telefone cadastrado"
            >
              <Icon.whatsapp s={12} /> Sem telefone
            </span>
          )}
          <button className="kp-btn kp-btn-sm" onClick={onEdit}>
            <Icon.edit s={12} /> Editar
          </button>
          <button className="kp-btn kp-btn-sm" style={{ padding: "7px 10px" }}>···</button>
        </div>
      </div>
    </div>
  );
}

// ─── Edit modal ─────────────────────────────────────────
function EditPropostaModal({ p, onClose, onSaved }) {
  const [title, setTitle] = React.useState(p.title || "");
  const [intro, setIntro] = React.useState(p.intro || "");
  const [valor, setValor] = React.useState(
    p.valor != null ? String(p.valor).replace(".", ",") : ""
  );
  const [paymentTerms, setPaymentTerms] = React.useState(
    p.pagamento && p.pagamento !== "Único" ? p.pagamento : ""
  );
  const [submitting, setSubmitting] = React.useState(false);
  const [error, setError] = React.useState(null);

  async function submit(e) {
    e.preventDefault();
    if (!title.trim()) {
      setError("Título é obrigatório.");
      return;
    }
    setSubmitting(true);
    setError(null);
    try {
      const cleaned = String(valor).replace(/[^0-9.,]/g, "").replace(",", ".");
      const cents = cleaned ? Math.round(parseFloat(cleaned) * 100) : 0;
      const res = await fetch(`/api/proposals/${p.id}`, {
        method: "PATCH",
        credentials: "include",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          title: title.trim(),
          intro: intro.trim() || null,
          totalAmount: cents,
          paymentTerms: paymentTerms.trim() || null,
        }),
      });
      if (!res.ok) {
        const j = await res.json().catch(() => ({}));
        throw new Error(j.error || `Falha (${res.status})`);
      }
      onSaved();
    } catch (err) {
      setError(err.message || "Falha ao salvar.");
      setSubmitting(false);
    }
  }

  return (
    <div onClick={onClose} style={{ position: "fixed", inset: 0, background: "rgba(10,10,10,0.5)", zIndex: 300, display: "flex", alignItems: "center", justifyContent: "center", padding: 20 }}>
      <div onClick={(e) => e.stopPropagation()} className="kp-card" style={{ padding: 28, maxWidth: 560, width: "100%", background: "var(--kp-paper)" }}>
        <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>EDITAR PROPOSTA</div>
        <h2 className="kp-display" style={{ fontSize: 32, lineHeight: 1.05, marginTop: 6 }}>Ajustar <em>os detalhes</em></h2>
        <form onSubmit={submit}>
          <div style={{ marginTop: 18, display: "flex", flexDirection: "column", gap: 12 }}>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>TÍTULO</span>
              <input className="kp-input" required autoFocus value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Proposta Setup IA" style={{ marginTop: 6 }} />
            </label>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>INTRODUÇÃO (OPCIONAL)</span>
              <textarea className="kp-input" value={intro} onChange={(e) => setIntro(e.target.value)} placeholder="Texto introdutório que aparece no topo da proposta..." rows={4} style={{ marginTop: 6, fontFamily: "inherit", resize: "vertical" }} />
            </label>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>VALOR (R$)</span>
              <input className="kp-input" value={valor} onChange={(e) => setValor(e.target.value)} placeholder="4000,00" style={{ marginTop: 6 }} />
            </label>
            <label>
              <span className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.18em", color: "var(--kp-muted)" }}>CONDIÇÕES DE PAGAMENTO</span>
              <input className="kp-input" value={paymentTerms} onChange={(e) => setPaymentTerms(e.target.value)} placeholder="50% entrada + 50% entrega" style={{ marginTop: 6 }} />
            </label>
          </div>
          {error && <div style={{ marginTop: 10, padding: "8px 12px", background: "#FFB5B5", border: "1.5px solid var(--kp-ink)", fontFamily: "var(--kp-mono)", fontSize: 10, letterSpacing: "0.14em" }}>⚠ {error}</div>}
          <div style={{ display: "flex", gap: 10, marginTop: 22 }}>
            <button type="button" onClick={onClose} className="kp-btn" style={{ flex: 1 }}>Cancelar</button>
            <button type="submit" disabled={submitting} className="kp-btn kp-btn-ink" style={{ flex: 2 }}>{submitting ? "Salvando..." : "Salvar alterações →"}</button>
          </div>
        </form>
      </div>
    </div>
  );
}

// ─── Top row: cliente + valor ───────────────────────────
function TopRow({ p, copyLink, copied }) {
  return (
    <div style={{ display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 16, marginBottom: 16 }}>
      {/* Cliente */}
      <div className="kp-card" style={{ padding: 22 }}>
        <div style={{ display: "flex", alignItems: "start", gap: 16, justifyContent: "space-between" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 14, minWidth: 0 }}>
            <Avatar initials={p.avatar} size={56} bg="var(--kp-cold)" />
            <div style={{ minWidth: 0 }}>
              <div className="kp-display" style={{ fontSize: 22, lineHeight: 1.1 }}>{p.cliente}</div>
              <div style={{ fontSize: 12, color: "var(--kp-muted)", marginTop: 4, display: "flex", gap: 8, alignItems: "center", flexWrap: "wrap" }}>
                <span style={{ fontFamily: "var(--kp-mono)", fontSize: 10.5, letterSpacing: "0.1em" }}>{p.empresa}</span>
                <span style={{ color: "var(--kp-faint)" }}>·</span>
                <span>{p.email}</span>
              </div>
            </div>
          </div>
          <TempPill temp={p.tempo} />
        </div>
        <div style={{
          marginTop: 16, border: "1.5px solid var(--kp-ink)",
          padding: "10px 14px", display: "flex", alignItems: "center", gap: 10,
          background: "var(--kp-soft)",
        }}>
          <Icon.link s={14} />
          <span style={{ fontFamily: "var(--kp-mono)", fontSize: 11, letterSpacing: "0.06em", color: "var(--kp-muted)", flex: 1, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
            {p.link}
          </span>
          <button onClick={copyLink} className="kp-btn kp-btn-sm" style={{ boxShadow: "1px 1px 0 0 var(--kp-ink)" }}>
            <Icon.copy s={12} /> {copied ? "Copiado!" : "Copiar"}
          </button>
        </div>
      </div>

      {/* Valor */}
      <div className="kp-card" style={{ padding: 24, background: "var(--kp-ink)", color: "var(--kp-paper)", boxShadow: "4px 4px 0 0 var(--kp-green)" }}>
        <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.22em", color: "var(--kp-faint)" }}>VALOR DA PROPOSTA</div>
        <div className="kp-display" style={{ fontSize: 56, fontStyle: "italic", lineHeight: 1, color: "var(--kp-paper)", marginTop: 8 }}>
          {brl(p.valor)}
        </div>
        <div style={{ fontSize: 13, color: "rgba(247,241,232,0.7)", marginTop: 12, lineHeight: 1.45 }}>
          Pagamento: <em style={{ color: "var(--kp-green)" }}>{p.pagamento}</em>
        </div>
      </div>
    </div>
  );
}

// ─── Metrics ────────────────────────────────────────────
function MetricsRow({ p }) {
  const cards = [
    { k: "VISUALIZAÇÕES", v: p.visualizacoes, sub: "Total de aberturas", icon: <Icon.eye s={12} />, bg: "var(--kp-pink-soft)" },
    { k: "TEMPO TOTAL", v: fmtDur(p.tempoTotalSeg), sub: "Na página da proposta", icon: <Icon.clock s={12} />, bg: "var(--kp-cold)" },
    { k: "TEMPERATURA", v: "Quente", sub: "Baseado em engajamento", icon: <Icon.flame s={12} />, bg: "var(--kp-warm)" },
    { k: "ENVIADA EM", v: "19 de abr.", sub: "20:54 · há 11 dias", icon: <Icon.send s={12} />, bg: "var(--kp-green)" },
  ];
  return (
    <div style={{ display: "grid", gridTemplateColumns: "repeat(4,1fr)", gap: 16, marginBottom: 16 }}>
      {cards.map(c => (
        <div key={c.k} className="kp-card" style={{ padding: 18 }}>
          <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)", display: "flex", alignItems: "center", gap: 6 }}>
            <span style={{
              width: 22, height: 22, background: c.bg,
              border: "1.5px solid var(--kp-ink)",
              display: "inline-flex", alignItems: "center", justifyContent: "center",
            }}>{c.icon}</span>
            {c.k}
          </div>
          <div className="kp-display" style={{ fontSize: typeof c.v === "string" && c.v.length > 6 ? 26 : 36, fontStyle: "italic", lineHeight: 1.05, marginTop: 10 }}>
            {c.v}
          </div>
          <div style={{ fontSize: 11.5, color: "var(--kp-muted)", marginTop: 6 }}>{c.sub}</div>
        </div>
      ))}
    </div>
  );
}

// ─── Bottom row: timeline + preview ─────────────────────
function BottomRow({ p, tab, setTab, liveTimeline, liveEventos }) {
  // Usa eventos reais quando disponíveis, fallback pro mock
  const tl = (liveTimeline && liveTimeline.length > 0) ? liveTimeline : (p.timeline || []);
  const ev = (liveEventos && liveEventos.length > 0) ? liveEventos : (p.eventos || []);
  return (
    <div style={{ display: "grid", gridTemplateColumns: "1fr 1.05fr", gap: 16 }}>
      <div>
        <Tabs tab={tab} setTab={setTab} />
        {tab === "timeline" && <Timeline events={tl} />}
        {tab === "eventos" && <Eventos rows={ev} />}
        {tab === "insights" && <Insights items={p.insights} score={p.iaScore} />}
      </div>
      <PreviewPanel p={p} />
    </div>
  );
}

function Tabs({ tab, setTab }) {
  const tabs = [["timeline", "Timeline"], ["eventos", "Eventos"], ["insights", "Insights IA"]];
  return (
    <div style={{ display: "flex", gap: 0, marginBottom: 14 }}>
      {tabs.map(([k, l]) => (
        <button key={k} onClick={()=>setTab(k)} style={{
          padding: "8px 16px",
          fontFamily: "var(--kp-mono)", fontSize: 10, letterSpacing: "0.16em", textTransform: "uppercase",
          border: "1.5px solid var(--kp-ink)",
          borderRight: "none",
          background: tab === k ? "var(--kp-ink)" : "var(--kp-white)",
          color: tab === k ? "var(--kp-paper)" : "var(--kp-ink)",
          boxShadow: tab === k ? "2px 2px 0 0 var(--kp-ink)" : "none",
          position: "relative", zIndex: tab === k ? 2 : 1,
        }}>{l}</button>
      ))}
      <div style={{ flex: 1, borderBottom: "1.5px solid var(--kp-ink)" }} />
    </div>
  );
}

// ─── Timeline ───────────────────────────────────────────
function Timeline({ events }) {
  return (
    <div className="kp-card" style={{ padding: 0 }}>
      <div style={{ padding: "16px 20px", borderBottom: "1.5px solid var(--kp-ink)", background: "var(--kp-soft)", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
        <div>
          <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em", color: "var(--kp-muted)" }}>ATIVIDADE</div>
          <div className="kp-display" style={{ fontSize: 18, marginTop: 2 }}>O que rolou nessa proposta</div>
        </div>
        <span className="kp-mono" style={{ fontSize: 9, color: "var(--kp-muted)", letterSpacing: "0.16em", display: "inline-flex", alignItems: "center", gap: 6 }}>
          <span className="kp-dot" /> Ao vivo
        </span>
      </div>
      <div style={{ padding: "16px 20px", maxHeight: 540, overflowY: "auto" }} className="scroll-clean">
        {events.map((e, i) => <TimelineRow key={i} e={e} last={i === events.length - 1} />)}
      </div>
    </div>
  );
}

function TimelineRow({ e, last }) {
  const map = {
    accept: { bg: "var(--kp-green)", icon: <Icon.check s={14} /> },
    ai: { bg: "var(--kp-pink)", icon: <Icon.sparkle s={14} /> },
    follow: { bg: "var(--kp-white)", icon: <Icon.send s={14} /> },
    view: { bg: "var(--kp-cold)", icon: <Icon.eye s={14} /> },
    send: { bg: "var(--kp-warm)", icon: <Icon.send s={14} /> },
  };
  const m = map[e.kind] || map.view;
  return (
    <div style={{ display: "flex", gap: 14, position: "relative", paddingBottom: last ? 0 : 18 }}>
      {!last && (
        <span style={{
          position: "absolute", left: 14, top: 28, bottom: 0,
          width: 1.5, background: "var(--kp-ink)", opacity: 0.2, borderLeft: "1.5px dashed var(--kp-ink)",
          borderRight: "none",
        }} />
      )}
      <div style={{
        width: 28, height: 28, background: m.bg,
        border: "1.5px solid var(--kp-ink)",
        display: "inline-flex", alignItems: "center", justifyContent: "center",
        flexShrink: 0, position: "relative", zIndex: 1,
      }}>{m.icon}</div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div style={{ display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }}>
          <strong style={{ fontSize: 14 }}>{e.label}</strong>
          {e.live && <span style={{ width: 7, height: 7, borderRadius: "50%", background: "var(--kp-pink)", border: "1px solid var(--kp-ink)" }} />}
        </div>
        {e.sub && <div style={{ fontSize: 13, color: "var(--kp-muted)", marginTop: 4, lineHeight: 1.45 }}>{e.sub}</div>}
        <div className="kp-mono" style={{ fontSize: 9, letterSpacing: "0.18em", color: "var(--kp-faint)", marginTop: 6 }}>{e.date}</div>
      </div>
    </div>
  );
}

// ─── Eventos table ─────────────────────────────────────
function Eventos({ rows }) {
  return (
    <div className="kp-card" style={{ padding: 0 }}>
      <div style={{ padding: "12px 18px", borderBottom: "1.5px solid var(--kp-ink)", background: "var(--kp-soft)", display: "grid", gridTemplateColumns: "1fr 0.8fr 2fr", fontFamily: "var(--kp-mono)", fontSize: 9, letterSpacing: "0.2em", textTransform: "uppercase", color: "var(--kp-muted)" }}>
        <div>Data</div><div>Ação</div><div>Detalhe</div>
      </div>
      {rows.map((r, i) => (
        <div key={i} style={{
          display: "grid", gridTemplateColumns: "1fr 0.8fr 2fr",
          padding: "11px 18px", fontSize: 12.5,
          borderBottom: i === rows.length - 1 ? "none" : "1px solid rgba(10,10,10,0.1)",
          background: i % 2 === 1 ? "var(--kp-soft)" : "var(--kp-white)",
        }}>
          <div className="kp-mono" style={{ fontSize: 10, letterSpacing: "0.12em" }}>{r.date}</div>
          <div>
            <span className="status-chip" style={{
              background: r.action === "ACEITA" ? "var(--kp-green)" : r.action === "SEND" ? "var(--kp-warm)" : "var(--kp-cold)",
            }}>{r.action}</span>
          </div>
          <div style={{ color: "var(--kp-muted)" }}>{r.detail}</div>
        </div>
      ))}
    </div>
  );
}

// ─── Insights ──────────────────────────────────────────
function Insights({ items, score }) {
  return (
    <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
      <div className="kp-card" style={{ padding: 22, background: "var(--kp-pink)" }}>
        <div className="kp-mono" style={{ fontSize: 9.5, letterSpacing: "0.2em" }}>SCORE PREDITIVO · IA</div>
        <div style={{ display: "flex", alignItems: "baseline", gap: 14, marginTop: 10 }}>
          <span className="kp-display" style={{ fontSize: 88, fontStyle: "italic", lineHeight: 0.9 }}>{score}<em style={{ fontSize: 36 }}>%</em></span>
          <span className="kp-display" style={{ fontSize: 22 }}>chance de fechar</span>
        </div>
        <p style={{ marginTop: 12, fontSize: 14, lineHeight: 1.5 }}>
          Baseado em 47 propostas suas anteriores. Modelo treinado com seu funil específico.
        </p>
      </div>
      {items.map((it, i) => (
        <div key={i} className="kp-card" style={{ padding: 20 }}>
          <div className="kp-display" style={{ fontSize: 20, lineHeight: 1.15 }}>{it.title}</div>
          <p style={{ fontSize: 13.5, lineHeight: 1.55, color: "var(--kp-muted)", marginTop: 6 }}>{it.body}</p>
        </div>
      ))}
    </div>
  );
}

// ─── Preview panel ─────────────────────────────────────
function PreviewPanel({ p }) {
  return (
    <div>
      <div style={{ display: "flex", justifyContent: "space-between", alignItems: "end", marginBottom: 14 }}>
        <div className="kp-display" style={{ fontSize: 18 }}>Preview da proposta</div>
        <span className="kp-mono" style={{ fontSize: 9.5, color: "var(--kp-muted)", letterSpacing: "0.16em" }}>Como o cliente vê</span>
      </div>
      <div className="kp-mock">
        <div className="kp-mock-titlebar">
          <div className="kp-mock-dots">
            <span style={{ background: "var(--kp-pink)" }} />
            <span style={{ background: "var(--kp-yellow)" }} />
            <span style={{ background: "var(--kp-green)" }} />
          </div>
          <span>{p.link}</span>
          <span></span>
        </div>
        <div style={{ height: 4, background: "var(--kp-blue)" }} />
        <div style={{ padding: "30px 32px 32px" }}>
          <h2 className="kp-display" style={{ fontSize: 32, lineHeight: 1.1, margin: 0, letterSpacing: "-0.02em" }}>
            {p.title}
          </h2>
          <p style={{ fontFamily: "var(--kp-mono)", fontSize: 11, letterSpacing: "0.1em", color: "var(--kp-muted)", marginTop: 10 }}>
            Para <em style={{ fontFamily: "var(--kp-display)", fontStyle: "italic", fontSize: 14, letterSpacing: 0 }}>{p.cliente}</em> · 19 de abril de 2026
          </p>
          <p style={{ fontSize: 14.5, lineHeight: 1.65, color: "var(--kp-ink)", marginTop: 18 }}>
            Com base nas evoluções discutidas, estruturamos este módulo para permitir que o agente avance além da qualificação, conduzindo o lead até o agendamento de forma automatizada.
          </p>
          <p style={{ fontSize: 14.5, lineHeight: 1.65, color: "var(--kp-ink)", marginTop: 14 }}>
            O objetivo é reduzir o atrito no processo comercial, permitindo que o próprio agente interprete a intenção do lead, sugira horários e realize o agendamento diretamente na agenda.
          </p>
          <p style={{ fontSize: 14.5, lineHeight: 1.65, color: "var(--kp-ink)", marginTop: 14 }}>
            Essa evolução traz ganho direto em conversão e eficiência operacional, eliminando a necessidade de intervenção manual em etapas que a IA pode conduzir com precisão.
          </p>

          {/* heatmap-ish reading indicator */}
          <div style={{ marginTop: 20, padding: "10px 12px", background: "var(--kp-soft)", border: "1.5px dashed rgba(10,10,10,0.3)", display: "flex", alignItems: "center", gap: 10 }}>
            <Icon.eye s={14} />
            <div style={{ fontSize: 11.5, lineHeight: 1.4 }}>
              <strong>Cliente leu esta seção 4 vezes.</strong> <span style={{ color: "var(--kp-muted)" }}>Provável ponto de decisão.</span>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

window.SEQ_PROPOSTA = PropostaDetalhe;
