/* Admin pages */
const ago = (iso) => {
  if (!iso) return "—";
  const diff = Date.now() - new Date(iso).getTime();
  if (!Number.isFinite(diff)) return "—";
  const mins = Math.floor(diff / 60000);
  if (mins < 1) return "just now";
  if (mins < 60) return `${mins}m`;
  const hrs = Math.floor(mins / 60);
  if (hrs < 24) return `${hrs}h`;
  return `${Math.floor(hrs / 24)}d`;
};

const AdminDashboard = ({ onGo }) => {
  const store = MK_USE();
  const metrics = store.adminMetrics || {};
  const queueRows = store.atQueue || [];
  return (
  <div className="page page-mount">
    <div className="page-header">
      <div>
        <div className="row gap-2" style={{ marginBottom: 8 }}><Chip kind="live" dot>All systems operational</Chip></div>
        <h1 className="page-title">Control plane</h1>
        <p className="page-sub">{metrics.active_tenants || 0} active tenants · {(queueRows || []).length} items need your attention.</p>
      </div>
      <div className="row gap-2">
        <button className="btn btn-outline"><Icon name="download"/> Export</button>
        <button className="btn btn-accent" onClick={() => onGo("create-tenant")}><Icon name="plus"/> New tenant</button>
      </div>
    </div>
    <div className="grid grid-4 stagger" style={{ marginBottom: 28 }}>
      <StatCard k="Active tenants" v={String(metrics.active_tenants || 0)} delta="live" up spark={<Spark/>}/>
      <StatCard k="Calls · 24h" v={String(metrics.calls_24h || 0)} delta="live" up spark={<Spark data={[10,14,9,16,12,20,18,24]}/>}/>
      <StatCard k="Answer rate" v={`${metrics.answer_rate || 0}%`} delta="live" up/>
      <StatCard k="Trunk success" v={`${metrics.trunk_success || 0}%`} delta="live" up/>
    </div>
    <div className="grid" style={{ gridTemplateColumns: "2fr 1fr", gap: 20 }}>
      <div className="card">
        <div className="row between" style={{ padding: "18px 20px", borderBottom: "1px solid var(--border)" }}>
          <div><div style={{ fontSize: 15, fontWeight: 500 }}>Operations queue</div><div style={{ fontSize: 12.5, color: "var(--fg-muted)" }}>Items that can't complete without you</div></div>
          <a className="dot-link" style={{ fontSize: 13 }} onClick={() => onGo("at-setup")}>Full queue →</a>
        </div>
        <table className="tbl">
          <thead><tr><th>Task</th><th>Tenant</th><th>Priority</th><th>Age</th><th></th></tr></thead>
          <tbody>
            {queueRows.length === 0 ? (
              <tr><td colSpan={5} style={{ color: "var(--fg-muted)", textAlign: "center", padding: 24 }}>No queue items.</td></tr>
            ) : queueRows.slice(0, 6).map((r) => (
              <tr key={r.id || r.number || r.tenant_id}>
                <td className="cell-strong">{r.action || "Manual setup needed"}</td>
                <td>{r.tenant_name || r.tenant_id || "—"}</td>
                <td><Chip kind={(r.priority || "medium")==="high"?"danger":"warn"} dot>{r.priority || "medium"}</Chip></td>
                <td className="mono" style={{ color: "var(--fg-muted)" }}>{ago(r.created_at)}</td>
                <td><button className="btn btn-primary btn-sm" onClick={() => onGo("at-setup")}>Resolve</button></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
      <div className="stack gap-4">
        <div className="card card-pad">
          <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 14 }}>System health</div>
          <div className="stack gap-3">
            {[["Africa's Talking trunk","up","p95 142ms"],["Livekit media","up","p95 89ms"],["Supabase","up","42ms"],["M-Pesa collections","degraded","timeouts"]].map((h, i) => (
              <div key={i} className="row between" style={{ padding: 10, background: "var(--bg-sunken)", borderRadius: 8 }}>
                <div className="row gap-2"><span className="live-dot" style={{ background: h[1]==="up"?"var(--mk-success)":"var(--mk-warning)" }}/><span style={{ fontSize: 13.5 }}>{h[0]}</span></div>
                <span className="mono" style={{ fontSize: 11.5, color: "var(--fg-muted)" }}>{h[2]}</span>
              </div>
            ))}
          </div>
        </div>
        <div className="card card-pad">
          <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 14 }}>Number pool</div>
          <div className="row gap-4" style={{ fontSize: 13 }}>
            <div><div className="num" style={{ fontSize: 28 }}>142</div><div style={{ color: "var(--fg-muted)", fontSize: 12 }}>ready</div></div>
            <div><div className="num" style={{ fontSize: 28 }}>36</div><div style={{ color: "var(--fg-muted)", fontSize: 12 }}>assigned</div></div>
            <div><div className="num" style={{ fontSize: 28, color: "var(--mk-warning)" }}>8</div><div style={{ color: "var(--fg-muted)", fontSize: 12 }}>setup</div></div>
          </div>
          <a className="dot-link" style={{ fontSize: 13, marginTop: 12, display: "block" }} onClick={() => onGo("number-pool")}>Manage pool →</a>
        </div>
      </div>
    </div>
  </div>
  );
};

const AdminTenants = ({ onGo }) => {
  const store = MK_USE();
  const [filter, setFilter] = useState("all");
  const [q, setQ] = useState("");
  const filters = ["all", "active", "pending", "suspended"];
  const rows = store.tenants.filter(t => (filter === "all" || t.status === filter) && t.name.toLowerCase().includes(q.toLowerCase()));
  return (
    <div className="page page-mount">
      <div className="page-header">
        <div><h1 className="page-title">Tenants</h1><p className="page-sub">{store.tenants.filter(t => t.status === "active").length} active · {store.tenants.filter(t => t.status === "pending").length} pending activation</p></div>
        <button className="btn btn-accent" onClick={() => onGo("create-tenant")}><Icon name="plus"/> New tenant</button>
      </div>
      <div className="row gap-3" style={{ marginBottom: 20, flexWrap: "wrap" }}>
        <div className="seg">{filters.map(f => <button key={f} className={filter===f?"on":""} onClick={() => setFilter(f)} style={{ textTransform: "capitalize" }}>{f}</button>)}</div>
        <div style={{ flex: 1, maxWidth: 320, position: "relative" }}>
          <Icon name="search" size={14} style={{ position: "absolute", left: 12, top: 11, color: "var(--fg-faint)" }}/>
          <input className="input" placeholder="Search by name, ID or number…" style={{ paddingLeft: 34 }} value={q} onChange={e => setQ(e.target.value)}/>
        </div>
      </div>
      <div className="card">
        {rows.length === 0 ? (
          <div style={{ padding: 48, textAlign: "center", color: "var(--fg-muted)" }}>No tenants match that filter.</div>
        ) : (
          <table className="tbl">
            <thead><tr><th>Tenant</th><th>Plan</th><th>Numbers</th><th>Calls 7d</th><th>Status</th><th>Created</th><th></th></tr></thead>
            <tbody>
              {rows.map(t => (
                <tr key={t.id} style={{ cursor: "pointer" }} onClick={() => onGo("tenant-detail")}>
                  <td>
                    <div className="row gap-3">
                      <div className="avatar" style={{ width: 32, height: 32, fontSize: 11, background: "var(--mk-ink)" }}>{t.name.split(" ").map(s=>s[0]).slice(0,2).join("")}</div>
                      <div className="cell-strong">{t.name}</div>
                    </div>
                  </td>
                  <td><Chip kind={t.plan==="Enterprise"?"purple":"accent"}>{t.plan}</Chip></td>
                  <td className="mono">{t.numbers}</td>
                  <td className="mono">{t.calls7d.toLocaleString()}</td>
                  <td><Chip kind={t.status==="active"?"live":t.status==="pending"?"warn":"danger"} dot>{t.status}</Chip></td>
                  <td style={{ color: "var(--fg-muted)" }}>{t.created}</td>
                  <td><Icon name="chevron-right" size={14} style={{ color: "var(--fg-faint)" }}/></td>
                </tr>
              ))}
            </tbody>
          </table>
        )}
      </div>
    </div>
  );
};

const TenantDetail = ({ onGo }) => {
  const [tab, setTab] = useState("overview");
  const [actionsOpen, setActionsOpen] = useState(false);
  const [addNum, setAddNum] = useState(false);
  const toast = useToast();
  useEffect(() => {
    if (!actionsOpen) return;
    const h = () => setActionsOpen(false);
    window.addEventListener("click", h);
    return () => window.removeEventListener("click", h);
  }, [actionsOpen]);
  return (
    <div className="page page-mount">
      <AddNumberModal open={addNum} onClose={() => setAddNum(false)}/>
      <div className="row gap-2" style={{ marginBottom: 12, fontSize: 13, color: "var(--fg-muted)" }}>
        <a className="dot-link" onClick={() => onGo("tenants")}>Tenants</a> / <span>Acme Dentistry</span>
      </div>
      <div className="page-header">
        <div>
          <div className="row gap-3" style={{ marginBottom: 8 }}>
            <div className="avatar" style={{ width: 44, height: 44, fontSize: 14, background: "var(--mk-ink)" }}>AD</div>
            <div>
              <h1 className="page-title" style={{ margin: 0 }}>Acme Dentistry</h1>
              <div className="row gap-2" style={{ marginTop: 4 }}>
                <Chip kind="live" dot>active</Chip>
                <Chip kind="accent">Growth</Chip>
                <span style={{ fontSize: 12, color: "var(--fg-muted)" }} className="mono">tenant_01HGHRQ</span>
              </div>
            </div>
          </div>
        </div>
        <div className="row gap-2">
          <button className="btn btn-outline" onClick={() => { toast({ title: "Impersonation started", body: "Viewing as Acme Dentistry." }); onGo("tenant-dashboard"); }}>Impersonate</button>
          <button className="btn btn-outline" onClick={() => setAddNum(true)}>Assign number</button>
          <div style={{ position: "relative" }} onClick={e => e.stopPropagation()}>
            <button className="btn btn-primary" onClick={() => setActionsOpen(o => !o)}>Actions <Icon name="chevron-down"/></button>
            {actionsOpen && (
              <div className="menu" style={{ position: "absolute", top: "calc(100% + 6px)", right: 0, minWidth: 220, background: "var(--bg-elev)", border: "1px solid var(--border)", borderRadius: "var(--r-md)", boxShadow: "var(--sh-lg)", padding: 4, zIndex: 50 }}>
                <div className="menu-item" onClick={() => { setActionsOpen(false); toast({ title: "Export started", body: "We'll email a link when ready." }); }}><Icon name="download" size={14}/> <span>Export tenant data</span></div>
                <div className="menu-item" onClick={() => { setActionsOpen(false); toast({ title: "Password reset sent" }); }}><Icon name="mail" size={14}/> <span>Send password reset</span></div>
                <div className="menu-item" onClick={() => { setActionsOpen(false); toast({ title: "Trunk re-synced" }); }}><Icon name="zap" size={14}/> <span>Re-sync trunk config</span></div>
                <div className="menu-sep"/>
                <div className="menu-item danger" onClick={async () => { setActionsOpen(false); await api.tenants.suspend("ten_acme"); toast({ title: "Tenant suspended", kind: "danger" }); }}><Icon name="x" size={14}/> <span>Suspend tenant</span></div>
              </div>
            )}
          </div>
        </div>
      </div>

      <div className="row gap-1" style={{ borderBottom: "1px solid var(--border)", marginBottom: 24 }}>
        {["overview","numbers","routing","calls","billing","technical","audit"].map(t => (
          <button key={t} onClick={() => setTab(t)} style={{ padding: "10px 14px", border: 0, background: "transparent", fontSize: 13.5, color: tab===t?"var(--fg)":"var(--fg-muted)", fontWeight: tab===t?500:400, textTransform: "capitalize", borderBottom: "2px solid " + (tab===t?"var(--mk-orange)":"transparent"), marginBottom: -1, cursor: "pointer" }}>{t}</button>
        ))}
      </div>

      {tab === "overview" && (
        <>
          <div className="grid grid-4 stagger" style={{ marginBottom: 24 }}>
            <StatCard k="Calls · 7d" v="342" delta="18%" up spark={<Spark/>}/>
            <StatCard k="Minutes used" v="580 / 1k"/>
            <StatCard k="Answer rate" v="98.1%" delta="stable" up/>
            <StatCard k="MRR" v="$39.00"/>
          </div>
          <div className="grid" style={{ gridTemplateColumns: "2fr 1fr", gap: 20 }}>
            <div className="card">
              <div style={{ padding: "16px 20px", borderBottom: "1px solid var(--border)", fontSize: 15, fontWeight: 500 }}>Numbers</div>
              <table className="tbl">
                <thead><tr><th>Number</th><th>Region</th><th>Callback</th><th>Status</th></tr></thead>
                <tbody>
                  <tr><td className="mono cell-strong">+254 20 765 4110</td><td>Nairobi</td><td className="mono" style={{ fontSize: 12 }}>trunk:197.232.94.18</td><td><Chip kind="live" dot>healthy</Chip></td></tr>
                  <tr><td className="mono cell-strong">+254 20 765 4212</td><td>Mombasa</td><td className="mono" style={{ fontSize: 12 }}>trunk:197.232.94.18</td><td><Chip kind="live" dot>healthy</Chip></td></tr>
                </tbody>
              </table>
            </div>
            <div className="card card-pad">
              <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 12 }}>Owner</div>
              <div className="row gap-3" style={{ marginBottom: 14 }}>
                <div className="avatar" style={{ width: 40, height: 40, fontSize: 13 }}>AM</div>
                <div><div style={{ fontWeight: 500, fontSize: 14 }}>Ayo Mwangi</div><div style={{ fontSize: 12.5, color: "var(--fg-muted)" }}>ayo@acme.ke</div></div>
              </div>
              <div className="hr" style={{ marginBottom: 14 }}/>
              <div style={{ fontSize: 14, fontWeight: 500, marginBottom: 10 }}>Recent events</div>
              <div className="stack gap-2" style={{ fontSize: 12.5, color: "var(--fg-muted)" }}>
                <div>3m ago · Call handled · +254 722 •••</div>
                <div>18m ago · Playbook updated</div>
                <div>2h ago · Invoice paid · $39.00</div>
              </div>
            </div>
          </div>
        </>
      )}
      {tab === "numbers" && <TDNumbers/>}
      {tab === "routing" && <TDRouting/>}
      {tab === "calls" && <TDCalls/>}
      {tab === "billing" && <TDBilling/>}
      {tab === "technical" && <TDTechnical/>}
      {tab === "audit" && <TDAudit/>}
    </div>
  );
};

const NumberPool = () => {
  const [rows, setRows] = useState([]);
  const [addNum, setAddNum] = useState(false);
  useEffect(() => {
    let alive = true;
    api.numbers.pool().then((items) => {
      if (!alive) return;
      setRows(items || []);
    }).catch(() => {
      if (!alive) return;
      setRows([]);
    });
    return () => { alive = false; };
  }, []);
  return (
    <div className="page page-mount">
      <AddNumberModal open={addNum} onClose={() => setAddNum(false)}/>
      <div className="page-header"><div><h1 className="page-title">Number pool</h1><p className="page-sub">186 total · 142 ready to assign · 8 mid-setup.</p></div>
        <div className="row gap-2"><button className="btn btn-outline"><Icon name="download"/> Export</button><button className="btn btn-accent" onClick={() => setAddNum(true)}><Icon name="plus"/> Add number</button></div>
      </div>
      <div className="card">
        <table className="tbl">
          <thead><tr><th>Number</th><th>Region</th><th>Status</th><th>Callback</th><th>Assigned to</th><th>Added</th></tr></thead>
          <tbody>
            {rows.length === 0 ? (
              <tr><td colSpan={6} style={{ color: "var(--fg-muted)", textAlign: "center", padding: 24 }}>No numbers in pool.</td></tr>
            ) : rows.map((r) => (
              <tr key={r.id}>
                <td className="mono cell-strong">{r.phone_number}</td>
                <td>{r.country_code || "—"}</td>
                <td><Chip kind={r.is_active ? "live" : "warn"} dot>{r.is_active ? "assigned" : "setup"}</Chip></td>
                <td className="mono" style={{ fontSize: 12, color: "var(--fg-muted)" }}>{r.callback_url || "pending"}</td>
                <td>{r.tenant_name || "—"}</td>
                <td style={{ color: "var(--fg-muted)" }}>{r.created_at ? new Date(r.created_at).toLocaleDateString() : "—"}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
};

const ATSetupQueue = () => {
  const toast = useToast();
  const [queue, setQueue] = useState([]);
  const [resolved, setResolved] = useState({});
  useEffect(() => {
    let alive = true;
    api.atQueue.queue().then((rows) => {
      if (!alive) return;
      setQueue(rows || []);
    }).catch(() => {
      if (!alive) return;
      setQueue([]);
    });
    return () => { alive = false; };
  }, []);
  const resolve = async (id) => { await api.atQueue.resolve(id); setResolved(r => ({ ...r, [id]: true })); toast({ title: "Marked complete" }); };
  return (
    <div className="page page-mount">
      <div className="page-header"><div><h1 className="page-title">AT setup queue</h1><p className="page-sub">Manual callback updates pending in the Africa's Talking dashboard.</p></div></div>
      <div className="stack gap-3">
        {queue.length === 0 ? (
          <div className="card card-pad" style={{ color: "var(--fg-muted)" }}>No pending setup tasks.</div>
        ) : queue.map((q) => (
          <div key={q.id} className="card card-pad" style={{ opacity: resolved[q.id] ? 0.55 : 1, transition: "opacity .3s" }}>
            <div className="row between" style={{ marginBottom: 14 }}>
              <div>
                <div className="row gap-3" style={{ marginBottom: 6 }}><span className="mono cell-strong">{q.number || q.phone_number || "—"}</span><Chip kind={resolved[q.id] ? "live" : "warn"} dot>{resolved[q.id] ? "resolved" : "awaiting you"}</Chip></div>
                <div style={{ fontSize: 13.5, color: "var(--fg-muted)" }}>{q.tenant_name || q.tenant_id || "—"} · {ago(q.created_at)} old</div>
              </div>
              {!resolved[q.id] && <button className="btn btn-accent btn-sm" onClick={() => resolve(q.id)}>Mark complete <Icon name="check"/></button>}
            </div>
            <div style={{ padding: 12, background: "var(--bg-sunken)", borderRadius: 10, fontSize: 13.5, marginBottom: 10 }}>
              <b>Next step:</b> {q.action || "Complete manual setup"}
            </div>
            <div className="row gap-2" style={{ fontSize: 12, color: "var(--fg-muted)" }}>
              <Chip>1. Provision</Chip>
              <Chip kind={(q.step || 1)>1?"live":"neutral"} dot={(q.step || 1)>1}>2. Whitelist IP</Chip>
              <Chip kind={(q.step || 1)>2?"live":"neutral"} dot={(q.step || 1)>2}>3. Callback URL</Chip>
              <Chip kind={(q.step || 1)>3?"live":"neutral"} dot={(q.step || 1)>3}>4. Test call</Chip>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
};

const AdminRouting = () => {
  const [routes, setRoutes] = useState([]);
  useEffect(() => {
    let alive = true;
    api.admin.rateRoutes().then((rows) => {
      if (!alive) return;
      setRoutes(rows || []);
    }).catch(() => {
      if (!alive) return;
      setRoutes([]);
    });
    return () => { alive = false; };
  }, []);
  return (
  <div className="page page-mount">
    <div className="page-header"><div><h1 className="page-title">Routing & LCR</h1><p className="page-sub">Carriers and least-cost routes per prefix.</p></div>
      <button className="btn btn-accent"><Icon name="plus"/> Add route</button></div>
    <div className="seg" style={{ marginBottom: 20 }}><button className="on">Rate routes</button><button>Carriers</button></div>
    <div className="card">
      <table className="tbl">
        <thead><tr><th>Prefix</th><th>Region</th><th>Primary</th><th>Failover</th><th>Rate</th><th>Status</th></tr></thead>
        <tbody>
          {routes.length === 0 ? (
            <tr><td colSpan={6} style={{ color: "var(--fg-muted)", textAlign: "center", padding: 24 }}>No routing rules found.</td></tr>
          ) : routes.map((r) => (
            <tr key={r.id || r.prefix}><td className="mono cell-strong">{r.prefix || "—"}</td><td>{r.region || "—"}</td><td>{r.primary_carrier || r.primary || "—"}</td><td style={{ color: "var(--fg-muted)" }}>{r.failover_carrier || r.failover || "—"}</td><td className="mono">{r.rate || "—"}</td><td><Chip kind={(r.status || "active")==="active"?"live":"neutral"} dot>{r.status || "active"}</Chip></td></tr>
          ))}
        </tbody>
      </table>
    </div>
  </div>
  );
};

const AdminFraud = () => {
  const [events, setEvents] = useState([]);
  useEffect(() => {
    let alive = true;
    api.admin.securityEvents().then((rows) => {
      if (!alive) return;
      setEvents(rows || []);
    }).catch(() => {
      if (!alive) return;
      setEvents([]);
    });
    return () => { alive = false; };
  }, []);
  return (
  <div className="page page-mount">
    <div className="page-header"><div><h1 className="page-title">Fraud & limits</h1><p className="page-sub">Security events and call-spend guardrails.</p></div></div>
    <div className="grid grid-4 stagger" style={{ marginBottom: 24 }}>
      <StatCard k="Blocked calls · 24h" v={String(events.filter((e) => e.action === "blocked").length)} delta="live events" up={false}/>
      <StatCard k="Fraud score avg" v={String(events.length ? (events.reduce((a, e) => a + Number(e.score || 0), 0) / events.length).toFixed(2) : "0.00")}/>
      <StatCard k="Rate-limited tenants" v={String(new Set(events.filter((e) => e.action === "throttled").map((e) => e.tenant_id)).size)}/>
      <StatCard k="Open events" v={String(events.length)}/>
    </div>
    <div className="card">
      <table className="tbl">
        <thead><tr><th>When</th><th>Tenant</th><th>Event</th><th>Severity</th><th>Action</th></tr></thead>
        <tbody>
          {events.length === 0 ? (
            <tr><td colSpan={5} style={{ color: "var(--fg-muted)", textAlign: "center", padding: 24 }}>No fraud/security events.</td></tr>
          ) : events.map((r) => (
            <tr key={r.id}><td style={{ color: "var(--fg-muted)" }}>{ago(r.created_at)}</td><td>{r.tenant_name || r.tenant_id || "—"}</td><td>{r.description || r.event || "Security event"}</td><td><Chip kind={(r.severity || "low")==="high"?"danger":(r.severity || "low")==="medium"?"warn":"neutral"} dot>{r.severity || "low"}</Chip></td><td style={{ color: "var(--fg-muted)" }}>{r.action || "review"}</td></tr>
          ))}
        </tbody>
      </table>
    </div>
  </div>
  );
};

const BillingPlans = () => (
  <div className="page page-mount">
    <div className="page-header"><div><h1 className="page-title">Billing plans</h1><p className="page-sub">Plans offered to tenants.</p></div>
      <button className="btn btn-accent"><Icon name="plus"/> New plan</button></div>
    <div className="grid grid-3 stagger">
      {[
        { n: "Starter", p: "$0", incl: "100 min", active: "6 tenants", kind: "neutral" },
        { n: "Growth", p: "$39", incl: "500 min · 1 number", active: "12 tenants", kind: "accent" },
        { n: "Scale", p: "$149", incl: "5,000 min · 5 numbers", active: "4 tenants", kind: "purple" },
      ].map((pl, i) => (
        <div key={i} className="card card-pad">
          <div className="row between" style={{ marginBottom: 16 }}>
            <div className="display" style={{ fontSize: 24, fontWeight: 600 }}>{pl.n}</div>
            <Chip kind={pl.kind}>{pl.active}</Chip>
          </div>
          <div className="display" style={{ fontSize: 44, fontWeight: 600, letterSpacing: "-0.03em" }}>{pl.p}<span style={{ fontSize: 14, color: "var(--fg-muted)", fontWeight: 400 }}>/mo</span></div>
          <div style={{ fontSize: 13, color: "var(--fg-muted)", marginTop: 8 }}>{pl.incl}</div>
          <button className="btn btn-outline btn-sm" style={{ marginTop: 18, width: "100%", justifyContent: "center" }}>Edit plan</button>
        </div>
      ))}
    </div>
  </div>
);

const AuditTrail = () => {
  const [logs, setLogs] = useState([]);
  useEffect(() => {
    let alive = true;
    api.admin.auditLogs().then((rows) => {
      if (!alive) return;
      setLogs(rows || []);
    }).catch(() => {
      if (!alive) return;
      setLogs([]);
    });
    return () => { alive = false; };
  }, []);
  return (
  <div className="page page-mount">
    <div className="page-header"><div><h1 className="page-title">Audit trail</h1><p className="page-sub">Every admin action, logged with actor + diff.</p></div>
      <div className="row gap-2"><button className="btn btn-outline"><Icon name="filter"/> Filter</button><button className="btn btn-outline"><Icon name="download"/> Export</button></div></div>
    <div className="card">
      <table className="tbl">
        <thead><tr><th>When</th><th>Actor</th><th>Action</th><th>Entity</th></tr></thead>
        <tbody>
          {logs.length === 0 ? (
            <tr><td colSpan={4} style={{ color: "var(--fg-muted)", textAlign: "center", padding: 24 }}>No audit logs found.</td></tr>
          ) : logs.map((r) => (
            <tr key={r.id}><td style={{ color: "var(--fg-muted)" }}>{ago(r.created_at)}</td><td className="mono" style={{ fontSize: 12 }}>{r.actor || r.user_email || "system"}</td><td className="cell-strong">{r.action || "update"}</td><td className="mono" style={{ fontSize: 12, color: "var(--fg-muted)" }}>{r.entity || r.target || "—"}</td></tr>
          ))}
        </tbody>
      </table>
    </div>
  </div>
  );
};

const AdminSettings = () => {
  const toast = useToast();
  return (
  <div className="page page-mount">
    <div className="page-header"><div><h1 className="page-title">Settings</h1><p className="page-sub">Platform configuration.</p></div></div>
    <div className="grid grid-2 stagger">
      {[
        { t: "Blocked callers", d: "12 numbers blocked across all tenants.", cta: "Manage" },
        { t: "Trunk diagnostics", d: "Last check: 2m ago · all green.", cta: "Run check" },
        { t: "API keys", d: "3 active · 1 expiring in 14 days.", cta: "Rotate" },
        { t: "Environment", d: "Production · region eu-west-1.", cta: "View config" },
      ].map((c, i) => (
        <div key={i} className="card card-pad">
          <div style={{ fontWeight: 500, marginBottom: 6 }}>{c.t}</div>
          <div style={{ fontSize: 13, color: "var(--fg-muted)", marginBottom: 14 }}>{c.d}</div>
          <button className="btn btn-outline btn-sm" onClick={() => toast({ title: c.t + " — " + c.cta })}>{c.cta}</button>
        </div>
      ))}
    </div>
  </div>
  );
};

const CreateTenant = ({ onGo }) => {
  const toast = useToast();
  const [form, setForm] = useState({ name: "", country: "Kenya", plan: "Starter", email: "" });
  const [busy, setBusy] = useState(false);
  const set = (k) => (e) => setForm(f => ({ ...f, [k]: e.target.value }));
  const submit = async () => {
    if (!form.name || !form.email) return;
    setBusy(true);
    await api.tenants.create(form);
    setBusy(false);
    toast({ title: "Tenant created", body: form.name + " has been invited." });
    onGo("tenants");
  };
  return (
    <div className="page page-mount">
      <div className="row gap-2" style={{ marginBottom: 12, fontSize: 13, color: "var(--fg-muted)" }}>
        <a className="dot-link" onClick={() => onGo("tenants")}>Tenants</a> / <span>New</span>
      </div>
      <div className="page-header"><div><h1 className="page-title">Create a tenant</h1><p className="page-sub">The tenant will receive an invite to complete self-service onboarding.</p></div></div>
      <div className="card card-pad" style={{ maxWidth: 620 }}>
        <div className="stack gap-4">
          <div className="field"><label>Business name</label><input className="input" placeholder="e.g. Acme Dentistry" value={form.name} onChange={set("name")}/></div>
          <div className="grid grid-2">
            <div className="field"><label>Country</label><select className="input" value={form.country} onChange={set("country")}><option>Kenya</option><option>Nigeria</option><option>Ghana</option><option>South Africa</option></select></div>
            <div className="field"><label>Plan</label><select className="input" value={form.plan} onChange={set("plan")}><option>Starter</option><option>Growth</option><option>Scale</option></select></div>
          </div>
          <div className="field"><label>Owner email</label><input className="input" placeholder="owner@business.co" value={form.email} onChange={set("email")}/></div>
          <div className="row gap-2" style={{ marginTop: 8 }}>
            <button className="btn btn-outline" onClick={() => onGo("tenants")}>Cancel</button>
            <button className="btn btn-accent" onClick={submit} disabled={busy || !form.name || !form.email}>{busy ? "Creating…" : "Create & send invite"}</button>
          </div>
        </div>
      </div>
    </div>
  );
};

Object.assign(window, { AdminDashboard, AdminTenants, TenantDetail, NumberPool, ATSetupQueue, AdminRouting, AdminFraud, BillingPlans, AuditTrail, AdminSettings, CreateTenant });
