// ui.jsx — shared UI: icons, primitives, helpers

const Icon = {
  // Generic icons used across the app
  home: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M3 11l9-7 9 7v9a2 2 0 0 1-2 2h-4v-6h-6v6H5a2 2 0 0 1-2-2v-9z"/></svg>,
  users: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="9" cy="8" r="3.5"/><path d="M3 20c0-3.3 2.7-6 6-6s6 2.7 6 6"/><path d="M16 4.5a3.5 3.5 0 0 1 0 7"/><path d="M21 20c0-2.4-1.4-4.4-3.5-5.4"/></svg>,
  doc: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"/><path d="M14 3v6h6"/><path d="M8 13h8"/><path d="M8 17h6"/></svg>,
  template: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>,
  inbox: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M22 12h-6l-2 3h-4l-2-3H2"/><path d="M5.5 5h13a2 2 0 0 1 2 1.6L22 12v6a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-6L3.5 6.6A2 2 0 0 1 5.5 5z"/></svg>,
  settings: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3h0a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8v0a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"/></svg>,
  plus: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M12 5v14M5 12h14"/></svg>,
  arrow: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M5 12h14M13 5l7 7-7 7"/></svg>,
  arrowL: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M19 12H5M11 5l-7 7 7 7"/></svg>,
  check: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M4 12l5 5L20 6"/></svg>,
  x: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M18 6 6 18M6 6l12 12"/></svg>,
  sparkle: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M12 3v4M12 17v4M3 12h4M17 12h4M5.6 5.6l2.8 2.8M15.6 15.6l2.8 2.8M5.6 18.4l2.8-2.8M15.6 8.4l2.8-2.8"/></svg>,
  send: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M22 2 11 13"/><path d="M22 2 15 22l-4-9-9-4 20-7z"/></svg>,
  copy: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>,
  link: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1"/><path d="M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1"/></svg>,
  search: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>,
  calendar: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>,
  clock: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>,
  upload: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M17 8l-5-5-5 5"/><path d="M12 3v12"/></svg>,
  money: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M12 1v22"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>,
  pen: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"/></svg>,
  more: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/></svg>,
  mail: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m2 7 10 6 10-6"/></svg>,
  download: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></svg>,
  external: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><path d="M15 3h6v6"/><path d="m10 14 11-11"/></svg>,
  shield: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>,
  flag: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M4 22V4a1 1 0 0 1 .4-.8c1.5-1 4-1.7 6.6.3 3 2.4 6 1.6 8-.3v9c-2 1.9-5 2.7-8 .3-2.6-2-5.1-1.3-6.6-.3"/></svg>,
  bell: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>,
  paperclip: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="m21.4 11.1-9.2 9.2a6 6 0 0 1-8.5-8.5l9.2-9.2a4 4 0 0 1 5.7 5.7l-9.2 9.2a2 2 0 1 1-2.9-2.9l8.5-8.4"/></svg>,
  layers: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="m12 2 10 6-10 6L2 8z"/><path d="m2 17 10 6 10-6"/><path d="m2 12 10 6 10-6"/></svg>,
  trash: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M3 6h18"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/></svg>,
  briefcase: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>,
  lightning: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="m13 2-9 11h7l-1 9 9-11h-7l1-9z"/></svg>,
  chevR: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="m9 18 6-6-6-6"/></svg>,
  chevD: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg>,
  signature: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M3 17c0-3 3-4 5-1s5 4 7-2"/><path d="M3 21h18"/></svg>,
  card: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><rect x="2" y="5" width="20" height="14" rx="2"/><path d="M2 10h20"/></svg>,
  globe: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15 15 0 0 1 0 20 15 15 0 0 1 0-20z"/></svg>,
  refresh: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M3 12a9 9 0 0 1 15-6.7L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-15 6.7L3 16"/><path d="M3 21v-5h5"/></svg>,
  filter: (p) => <svg className={"ico " + (p?.cls||"")} viewBox="0 0 24 24"><path d="M22 3H2l8 9.5V19l4 2v-8.5z"/></svg>,
};

// Tiny logo mark
function LogoMark({ size = 22, color = "var(--primary)" }) {
  return (
    <svg width={size} height={size} viewBox="0 0 32 32" fill="none">
      <rect x="2" y="2" width="28" height="28" rx="8" fill={color}/>
      <path d="M10 22V10h7a4 4 0 0 1 1.7 7.6L23 22h-3.5l-3.7-4.2H13V22h-3z" fill="#FCFBF8"/>
      <circle cx="22.5" cy="9.5" r="2" fill="#C9A961"/>
    </svg>
  );
}

function Avatar({ name, size = 28, bg, fg }) {
  const initials = (name || "").split(/\s+/).map(w => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
  const palette = [
    ["#DCE8E1", "#1B4332"],
    ["#F4E8DB", "#8A5E2C"],
    ["#DDE6F4", "#2C4D8A"],
    ["#F4DDD9", "#B23A2E"],
    ["#E8DEF0", "#5B3F8A"],
    ["#E6E6E0", "#5B635E"],
  ];
  const idx = (name || "").split("").reduce((a, c) => a + c.charCodeAt(0), 0) % palette.length;
  const [pbg, pfg] = palette[idx];
  return (
    <span className="avatar" style={{ width: size, height: size, fontSize: size * 0.4, background: bg || pbg, color: fg || pfg }}>
      {initials || "•"}
    </span>
  );
}

function Pill({ status, children }) {
  const map = {
    "lead":    { cls: "pill-lead",    dot: "#92400E", label: "Lead" },
    "new":     { cls: "pill-new",     dot: "#2C4D8A", label: "Invited" },
    "active":  { cls: "pill-active",  dot: "#1B4332", label: "Active" },
    "pending": { cls: "pill-pending", dot: "#8A5E2C", label: "Pending" },
    "done":    { cls: "pill-done",    dot: "#5B635E", label: "Complete" },
    "overdue": { cls: "pill-overdue", dot: "#B23A2E", label: "Overdue" },
  };
  const s = map[status] || map.pending;
  return (
    <span className={"badge " + s.cls}>
      <span className="badge-dot" style={{ background: s.dot }}/>
      {children || s.label}
    </span>
  );
}

function Card({ children, pad = true, style, className = "" }) {
  return <div className={"card " + className} style={style}>{pad ? <div className="card-pad">{children}</div> : children}</div>;
}

function Section({ title, sub, right, children, className = "" }) {
  return (
    <div className={"col gap-12 " + className}>
      {(title || right) && (
        <div className="row" style={{ justifyContent: "space-between", alignItems: "flex-end" }}>
          <div className="col gap-4">
            {title && <div style={{ fontSize: 15, fontWeight: 600, letterSpacing: "-0.01em" }}>{title}</div>}
            {sub && <div className="ink-3" style={{ fontSize: 12.5 }}>{sub}</div>}
          </div>
          {right}
        </div>
      )}
      {children}
    </div>
  );
}

function Button({ variant = "default", size = "md", icon, iconR, children, onClick, disabled, style, type, className = "" }) {
  const cls = ["btn"];
  if (variant === "primary") cls.push("btn-primary");
  if (variant === "ghost") cls.push("btn-ghost");
  if (size === "sm") cls.push("btn-sm");
  if (size === "lg") cls.push("btn-lg");
  return (
    <button type={type || "button"} className={cls.join(" ") + " " + className} onClick={onClick} disabled={disabled} style={{ opacity: disabled ? 0.5 : 1, ...style }}>
      {icon}
      {children}
      {iconR}
    </button>
  );
}

function StatBlock({ label, value, sub, accent }) {
  return (
    <div className="col gap-6" style={{ padding: "18px 22px", background: "var(--surface)", border: "1px solid var(--line)", borderRadius: 10, minWidth: 0 }}>
      <div className="label" style={{ fontSize: 10.5 }}>{label}</div>
      <div style={{ display: "flex", alignItems: "baseline", gap: 8 }}>
        <span className="h-display" style={{ fontSize: 32, color: accent || "var(--ink)", lineHeight: 1 }}>{value}</span>
        {sub && <span className="ink-3" style={{ fontSize: 12 }}>{sub}</span>}
      </div>
    </div>
  );
}

// Format currency given a code
function fmtMoney(amount, code = "USD") {
  const sym = { USD: "$", EUR: "€", GBP: "£", PHP: "₱", CAD: "CA$", AUD: "A$" }[code] || "$";
  const n = Number(amount || 0);
  return sym + n.toLocaleString("en-US", { maximumFractionDigits: 2 });
}

function fmtDate(d) {
  try {
    return new Date(d).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" });
  } catch { return d; }
}

function fmtDateShort(d) {
  try {
    return new Date(d).toLocaleDateString("en-US", { month: "short", day: "numeric" });
  } catch { return d; }
}

// ─────────────────────────────────────────────────────────────────────
// Integration pin — numbered marker at each spot that needs a real API.
// Visible only when tweaks.showIntegrations is on. Hover/click → popover
// with endpoint, request/response shape, recommended service.
// ─────────────────────────────────────────────────────────────────────
function IntegrationPin({ n, name, service, endpoint, request, response, note, placement = "right" }) {
  const show = window.__showIntegrations;
  const [open, setOpen] = React.useState(false);
  if (!show) return null;
  const pos = {
    right:  { left: "100%", top: "50%", transform: "translate(8px, -50%)" },
    left:   { right: "100%", top: "50%", transform: "translate(-8px, -50%)" },
    top:    { left: "50%", bottom: "100%", transform: "translate(-50%, -8px)" },
    bottom: { left: "50%", top: "100%", transform: "translate(-50%, 8px)" },
  }[placement];
  return (
    <span style={{ position: "relative", display: "inline-flex", verticalAlign: "middle" }}
      onMouseEnter={() => setOpen(true)} onMouseLeave={() => setOpen(false)}>
      <button onClick={() => setOpen(o => !o)}
        style={{
          width: 20, height: 20, borderRadius: "50%",
          background: "#2C4D8A", color: "#fff", border: "2px solid #fff",
          boxShadow: "0 0 0 1px rgba(44,77,138,0.4), 0 2px 6px rgba(44,77,138,0.25)",
          fontSize: 10.5, fontWeight: 700, fontFamily: "Geist Mono, monospace",
          cursor: "pointer", padding: 0, display: "grid", placeItems: "center",
          letterSpacing: 0, animation: "pulse 2.4s ease infinite",
        }}>{n}</button>
      {open && (
        <div className="fade-in" style={{
          position: "absolute", ...pos, zIndex: 50,
          width: 340, background: "#0F1A14", color: "#fff",
          borderRadius: 10, padding: 14, fontSize: 11.5, lineHeight: 1.55,
          boxShadow: "0 12px 32px rgba(0,0,0,0.28), 0 2px 6px rgba(0,0,0,0.18)",
        }}>
          <div className="row gap-6" style={{ alignItems: "center", marginBottom: 8 }}>
            <span style={{ background: "#2C4D8A", color: "#fff", borderRadius: 999, padding: "1px 7px", fontSize: 10, fontWeight: 700, fontFamily: "Geist Mono, monospace" }}>#{n}</span>
            <span style={{ fontSize: 13, fontWeight: 600 }}>{name}</span>
            <span style={{ marginLeft: "auto", background: "rgba(255,255,255,0.08)", color: "rgba(255,255,255,0.7)", fontSize: 9.5, padding: "1px 6px", borderRadius: 4, textTransform: "uppercase", letterSpacing: "0.04em" }}>mocked</span>
          </div>
          <div style={{ color: "rgba(255,255,255,0.55)", fontSize: 10.5, textTransform: "uppercase", letterSpacing: "0.06em", marginBottom: 3 }}>Service</div>
          <div style={{ marginBottom: 8 }}>{service}</div>
          {endpoint && <>
            <div style={{ color: "rgba(255,255,255,0.55)", fontSize: 10.5, textTransform: "uppercase", letterSpacing: "0.06em", marginBottom: 3 }}>Endpoint</div>
            <div className="mono" style={{ background: "rgba(255,255,255,0.06)", padding: "5px 8px", borderRadius: 5, fontSize: 10.5, marginBottom: 8, wordBreak: "break-all" }}>{endpoint}</div>
          </>}
          {request && <>
            <div style={{ color: "rgba(255,255,255,0.55)", fontSize: 10.5, textTransform: "uppercase", letterSpacing: "0.06em", marginBottom: 3 }}>Request</div>
            <pre className="mono" style={{ background: "rgba(255,255,255,0.06)", padding: "6px 8px", borderRadius: 5, fontSize: 10, margin: "0 0 8px", whiteSpace: "pre-wrap", lineHeight: 1.45 }}>{request}</pre>
          </>}
          {response && <>
            <div style={{ color: "rgba(255,255,255,0.55)", fontSize: 10.5, textTransform: "uppercase", letterSpacing: "0.06em", marginBottom: 3 }}>Response</div>
            <pre className="mono" style={{ background: "rgba(255,255,255,0.06)", padding: "6px 8px", borderRadius: 5, fontSize: 10, margin: "0 0 8px", whiteSpace: "pre-wrap", lineHeight: 1.45 }}>{response}</pre>
          </>}
          {note && <div style={{ color: "rgba(255,255,255,0.75)", fontSize: 11, fontStyle: "italic" }}>{note}</div>}
        </div>
      )}
    </span>
  );
}

Object.assign(window, { Icon, LogoMark, Avatar, Pill, Card, Section, Button, StatBlock, fmtMoney, fmtDate, fmtDateShort, IntegrationPin });
