// Admin interface: documents, folders, users, groups, upload

const AdminApp = ({ user, onSwitchRole, onExit, onPushToast }) => {
  const [section, setSection] = React.useState("dashboard");
  const [uploadOpen, setUploadOpen] = React.useState(false);
  const [editingUser, setEditingUser] = React.useState(null);
  const [editingGroup, setEditingGroup] = React.useState(null);
  const [editingFolder, setEditingFolder] = React.useState(null);

  return (
    <div className="app" data-screen-label="Admin">
      <PortalTopbar role="admin" onSwitchRole={onSwitchRole} user={user} active="admin" onOpenAdmin={() => {}} onHome={onExit} />
      <div className="main">
        <div className="admin-shell">
          <aside className="admin-side">
            <h4>Manage</h4>
            <AdminNavItem icon="home"     label="Overview"  active={section === "dashboard"} onClick={() => setSection("dashboard")} />
            <AdminNavItem icon="file"     label="Documents" active={section === "documents"} onClick={() => setSection("documents")} count={window.PORTAL_DATA.documents.length} />
            <AdminNavItem icon="folder"   label="Folders"   active={section === "folders"}   onClick={() => setSection("folders")} count={window.PORTAL_DATA.periods.length} />

            <h4>Access</h4>
            <AdminNavItem icon="user"     label="Users"     active={section === "users"}    onClick={() => setSection("users")}  count={window.PORTAL_DATA.users.length} />
            <AdminNavItem icon="users"    label="Groups"    active={section === "groups"}   onClick={() => setSection("groups")} count={window.PORTAL_DATA.groups.length} />
            <AdminNavItem icon="shield"   label="Audit log" active={section === "audit"}    onClick={() => setSection("audit")} />

            <h4>System</h4>
            <AdminNavItem icon="bell"     label="Notifications" active={section === "notifications"} onClick={() => setSection("notifications")} />
            <AdminNavItem icon="settings" label="Settings"      active={section === "settings"}      onClick={() => setSection("settings")} />
          </aside>

          <main className="admin-main">
            {section === "dashboard"     && <AdminDashboard onUpload={() => setUploadOpen(true)} onSection={setSection} />}
            {section === "documents"     && <AdminDocuments onUpload={() => setUploadOpen(true)} onPushToast={onPushToast} />}
            {section === "folders"       && <AdminFolders onEdit={setEditingFolder} />}
            {section === "users"         && <AdminUsers onEdit={setEditingUser} />}
            {section === "groups"        && <AdminGroups onEdit={setEditingGroup} />}
            {section === "audit"         && <AdminAudit />}
            {section === "notifications" && <AdminNotifications />}
            {section === "settings"      && <AdminSettings />}
          </main>
        </div>
        <PortalFooter />
      </div>

      {uploadOpen && <UploadModal onClose={() => setUploadOpen(false)} onPushToast={onPushToast} />}
      {editingUser && <UserModal user={editingUser} onClose={() => setEditingUser(null)} onPushToast={onPushToast} />}
      {editingGroup && <GroupModal group={editingGroup} onClose={() => setEditingGroup(null)} onPushToast={onPushToast} />}
      {editingFolder && <FolderModal folder={editingFolder} onClose={() => setEditingFolder(null)} onPushToast={onPushToast} />}
    </div>
  );
};

const AdminNavItem = ({ icon, label, active, onClick, count }) => (
  <div className={"admin-nav-item " + (active ? "active" : "")} onClick={onClick}>
    <Icon name={icon} size={15} />
    <span style={{ flex: 1 }}>{label}</span>
    {count !== undefined && <span style={{ fontSize: 11, color: "var(--ink-4)", fontVariantNumeric: "tabular-nums" }}>{count}</span>}
  </div>
);

// ─── Dashboard ────────────────────────────────────────────────────────────

const AdminDashboard = ({ onUpload, onSection }) => {
  const data = window.PORTAL_DATA;
  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Administration · {data.firm.name}</div>
          <h1>Good morning, <em>Marcus</em>.</h1>
          <p className="page-sub">Q1 2026 distribution closes in 12 days. Three documents are still pending review by counsel.</p>
        </div>
        <div style={{ display: "flex", gap: 8 }}>
          <button className="btn btn-ghost"><Icon name="folder" size={14} /> New folder</button>
          <button className="btn btn-primary" onClick={onUpload}><Icon name="upload" size={14} /> Upload documents</button>
        </div>
      </header>

      <div className="stat-grid">
        <Stat label="Total documents" value="142" delta="+8 this quarter" up />
        <Stat label="Active investors" value="89" delta="2 invitations pending" />
        <Stat label="Q1 2026 distribution" value={<><em>62%</em></>} delta="55 of 89 viewed" />
        <Stat label="Storage" value="3.2 GB" delta="of 50 GB allocated" />
      </div>

      <div style={{ display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 24 }}>
        <div className="card">
          <div className="card-head">
            <div>
              <div className="card-title">Recent activity</div>
              <div style={{ fontSize: 12, color: "var(--ink-3)" }}>All admin and download events, last 14 days.</div>
            </div>
            <button className="btn btn-quiet btn-sm" onClick={() => onSection("audit")}>Full log <Icon name="arrowRight" size={12} /></button>
          </div>
          <div style={{ padding: "8px 20px 12px" }}>
            {data.activity.map((a, i) => (
              <div key={i} className="activity-row">
                <span className={"activity-dot " + (a.what === "downloaded" ? "gray" : "")} />
                <span className="activity-text">
                  <strong>{a.who}</strong> {a.what} <strong>{a.target}</strong>
                  {a.period && <span style={{ color: "var(--ink-4)" }}> · {a.period}</span>}
                </span>
                <span className="activity-time">{a.time}</span>
              </div>
            ))}
          </div>
        </div>

        <div className="card">
          <div className="card-head">
            <div className="card-title">Quarter readiness</div>
          </div>
          <div style={{ padding: 20 }}>
            {[
              { label: "Quarterly Letter", status: "Published", on: true },
              { label: "Performance Report", status: "Published", on: true },
              { label: "Capital Statements (24)", status: "Published", on: true },
              { label: "Holdings Detail", status: "Pending counsel", on: false },
              { label: "Risk Summary", status: "Pending counsel", on: false },
              { label: "ESG Report", status: "Pending counsel", on: false },
            ].map((it, i) => (
              <div key={i} style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "10px 0", borderBottom: "1px solid var(--rule)", fontSize: 13 }}>
                <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
                  <span style={{
                    width: 16, height: 16, borderRadius: "50%",
                    border: "1.5px solid " + (it.on ? "var(--success)" : "var(--rule-2)"),
                    background: it.on ? "var(--success)" : "transparent",
                    display: "grid", placeItems: "center"
                  }}>
                    {it.on && <Icon name="check" size={9} stroke={3} style={{ color: "white" }} />}
                  </span>
                  {it.label}
                </div>
                <span style={{ fontSize: 11, color: it.on ? "var(--success)" : "var(--ink-3)", letterSpacing: ".08em", textTransform: "uppercase" }}>{it.status}</span>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
};

const Stat = ({ label, value, delta, up }) => (
  <div className="stat">
    <div className="lbl">{label}</div>
    <div className="val">{value}</div>
    {delta && <div className={"delta" + (up ? " up" : "")}>{delta}</div>}
  </div>
);

// ─── Documents ────────────────────────────────────────────────────────────

const AdminDocuments = ({ onUpload, onPushToast }) => {
  const data = window.PORTAL_DATA;
  const [period, setPeriod] = React.useState("all");
  const [search, setSearch] = React.useState("");
  const [selected, setSelected] = React.useState(new Set());

  const visible = data.documents.filter(d => {
    if (period !== "all" && d.period !== period) return false;
    if (search && !d.title.toLowerCase().includes(search.toLowerCase())) return false;
    return true;
  });

  const toggle = (id) => {
    const n = new Set(selected);
    n.has(id) ? n.delete(id) : n.add(id);
    setSelected(n);
  };

  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Library</div>
          <h1>Documents</h1>
          <p className="page-sub">{data.documents.length} documents across {data.periods.length} reporting periods. Click any document to edit visibility, replace the file, or attach it to a different period.</p>
        </div>
        <div style={{ display: "flex", gap: 8 }}>
          <button className="btn btn-ghost"><Icon name="download" size={14} /> Export index</button>
          <button className="btn btn-primary" onClick={onUpload}><Icon name="upload" size={14} /> Upload</button>
        </div>
      </header>

      <div className="filter-bar">
        <div className="search-wrap" style={{ flex: 1 }}>
          <Icon name="search" size={14} />
          <input className="input" placeholder="Search all documents…" value={search} onChange={(e) => setSearch(e.target.value)} />
        </div>
        <select className="select" style={{ width: 200, height: 38 }} value={period} onChange={(e) => setPeriod(e.target.value)}>
          <option value="all">All periods</option>
          {data.periods.map(p => <option key={p.id} value={p.id}>{p.label}</option>)}
        </select>
        {selected.size > 0 && (
          <div style={{ display: "flex", alignItems: "center", gap: 8, marginLeft: "auto", padding: "4px 10px", background: "var(--ink)", color: "var(--paper)", borderRadius: 99, fontSize: 12 }}>
            <span>{selected.size} selected</span>
            <button className="btn btn-quiet btn-sm" style={{ color: "var(--paper)" }}><Icon name="users" size={13} /> Reassign groups</button>
            <button className="btn btn-quiet btn-sm" style={{ color: "var(--paper)" }} onClick={() => { setSelected(new Set()); onPushToast(`${selected.size} documents archived`); }}><Icon name="trash" size={13} /> Archive</button>
          </div>
        )}
      </div>

      <div className="card">
        <table className="doc-table">
          <thead>
            <tr>
              <th style={{ width: 38 }}>
                <input type="checkbox" checked={selected.size === visible.length && visible.length > 0} onChange={(e) => setSelected(e.target.checked ? new Set(visible.map(d => d.id)) : new Set())} />
              </th>
              <th>Document</th>
              <th>Period</th>
              <th>Visible to</th>
              <th>Updated</th>
              <th style={{ textAlign: "right", width: 60 }}></th>
            </tr>
          </thead>
          <tbody>
            {visible.map(d => {
              const periodObj = data.periods.find(p => p.id === d.period);
              return (
                <tr key={d.id} className={selected.has(d.id) ? "selected" : ""}>
                  <td onClick={(e) => e.stopPropagation()}>
                    <input type="checkbox" checked={selected.has(d.id)} onChange={() => toggle(d.id)} />
                  </td>
                  <td>
                    <div className="doc-title">
                      <FileTag type={d.type} />
                      <div>
                        <div className="doc-name-row">
                          <span className="doc-name">{d.title}</span>
                          {d.restricted && <span className="badge badge-restricted"><Icon name="lock" size={9} stroke={2} /> Restricted</span>}
                        </div>
                        <div className="doc-meta">{d.date} · {d.size} · <span className="cat-pill" style={{ fontSize: 10, padding: "1px 7px" }}>{d.category}</span></div>
                      </div>
                    </div>
                  </td>
                  <td className="tnum" style={{ color: "var(--ink-3)" }}>{periodObj?.label}</td>
                  <td>
                    <div style={{ display: "flex", gap: 4, flexWrap: "wrap" }}>
                      {d.groups.slice(0, 2).map(gid => {
                        const g = data.groups.find(x => x.id === gid);
                        return <span key={gid} className="cat-pill" style={{ fontSize: 10.5 }}>{g?.name}</span>;
                      })}
                      {d.groups.length > 2 && <span className="cat-pill" style={{ fontSize: 10.5 }}>+{d.groups.length - 2}</span>}
                    </div>
                  </td>
                  <td style={{ color: "var(--ink-3)", fontSize: 12 }}>{d.updated || "—"}</td>
                  <td>
                    <button className="btn btn-quiet btn-sm" onClick={(e) => e.stopPropagation()}><Icon name="moreH" size={14} /></button>
                  </td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>
    </div>
  );
};

// ─── Folders ──────────────────────────────────────────────────────────────

const AdminFolders = ({ onEdit }) => {
  const data = window.PORTAL_DATA;
  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Reporting periods</div>
          <h1>Folders</h1>
          <p className="page-sub">Folders represent reporting periods. Documents with a date in the period's range automatically appear in the matching folder.</p>
        </div>
        <button className="btn btn-primary" onClick={() => onEdit({ id: null, label: "", type: "quarter" })}><Icon name="plus" size={14} /> New folder</button>
      </header>

      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))", gap: 16 }}>
        {data.periods.map(p => (
          <div key={p.id} className="card" style={{ padding: 20, cursor: "pointer" }} onClick={() => onEdit(p)}>
            <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 16 }}>
              <Icon name="folder" size={20} stroke={1.25} />
              <span className={"pc-status " + p.status}>{p.status}</span>
            </div>
            <div className="serif" style={{ fontSize: 22, lineHeight: 1, marginBottom: 6, letterSpacing: "-0.01em" }}>{p.label}</div>
            <div style={{ fontSize: 12, color: "var(--ink-3)", marginBottom: 14 }}>{p.dateRange || "—"}</div>
            <div style={{ display: "flex", justifyContent: "space-between", paddingTop: 14, borderTop: "1px solid var(--rule)", fontSize: 11.5, color: "var(--ink-3)" }}>
              <span><strong style={{ color: "var(--ink)", fontSize: 13 }}>{p.docCount}</strong> documents</span>
              <span style={{ textTransform: "uppercase", letterSpacing: ".08em" }}>{p.type}</span>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
};

// ─── Users ────────────────────────────────────────────────────────────────

const AdminUsers = ({ onEdit }) => {
  const data = window.PORTAL_DATA;
  const [search, setSearch] = React.useState("");
  const visible = data.users.filter(u => !search || u.name.toLowerCase().includes(search.toLowerCase()) || u.entity.toLowerCase().includes(search.toLowerCase()));

  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Access · {data.users.length} accounts</div>
          <h1>Users</h1>
          <p className="page-sub">Manage investor accounts, group membership and access status. Pending users have been invited but haven't completed sign-in.</p>
        </div>
        <button className="btn btn-primary" onClick={() => onEdit({ id: null, name: "", email: "", entity: "", groups: [], status: "active" })}><Icon name="plus" size={14} /> Add user</button>
      </header>

      <div className="filter-bar">
        <div className="search-wrap" style={{ flex: 1 }}>
          <Icon name="search" size={14} />
          <input className="input" placeholder="Search by name, entity or email…" value={search} onChange={(e) => setSearch(e.target.value)} />
        </div>
      </div>

      <div className="card">
        <table className="doc-table">
          <thead>
            <tr>
              <th>Investor</th>
              <th>Entity</th>
              <th>Groups</th>
              <th>Status</th>
              <th>Last active</th>
              <th style={{ width: 60 }}></th>
            </tr>
          </thead>
          <tbody>
            {visible.map(u => (
              <tr key={u.id} onClick={() => onEdit(u)}>
                <td>
                  <div style={{ display: "flex", alignItems: "center", gap: 12 }}>
                    <Avatar initials={u.name.split(" ").map(s => s[0]).slice(0,2).join("")} />
                    <div>
                      <div className="doc-name">{u.name}</div>
                      <div className="doc-meta">{u.email}</div>
                    </div>
                  </div>
                </td>
                <td style={{ color: "var(--ink-2)" }}>{u.entity}</td>
                <td>
                  <div style={{ display: "flex", gap: 4, flexWrap: "wrap" }}>
                    {u.groups.map(gid => {
                      const g = data.groups.find(x => x.id === gid);
                      return <span key={gid} className="cat-pill" style={{ fontSize: 10.5 }}>{g?.name}</span>;
                    })}
                  </div>
                </td>
                <td>
                  {u.status === "pending" ? <span className="badge badge-pending">Pending</span> : <span style={{ display: "inline-flex", alignItems: "center", gap: 6, fontSize: 12, color: "var(--success)" }}><span style={{ width: 6, height: 6, borderRadius: "50%", background: "var(--success)" }} /> Active</span>}
                </td>
                <td style={{ color: "var(--ink-3)", fontSize: 12 }}>{u.lastActive}</td>
                <td><button className="btn btn-quiet btn-sm" onClick={(e) => e.stopPropagation()}><Icon name="moreH" size={14} /></button></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
};

// ─── Groups ───────────────────────────────────────────────────────────────

const AdminGroups = ({ onEdit }) => {
  const data = window.PORTAL_DATA;
  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Access · {data.groups.length} groups</div>
          <h1>Groups</h1>
          <p className="page-sub">Groups control which documents users can see. Assign documents to one or more groups and add users to those groups.</p>
        </div>
        <button className="btn btn-primary" onClick={() => onEdit({ id: null, name: "", description: "", memberCount: 0 })}><Icon name="plus" size={14} /> New group</button>
      </header>

      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(320px, 1fr))", gap: 16 }}>
        {data.groups.map(g => {
          const docCount = data.documents.filter(d => d.groups.includes(g.id)).length;
          return (
            <div key={g.id} className="card" style={{ padding: 24, cursor: "pointer" }} onClick={() => onEdit(g)}>
              <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between", marginBottom: 18 }}>
                <Icon name="users" size={22} stroke={1.25} />
                <button className="btn btn-quiet btn-sm" onClick={(e) => e.stopPropagation()}><Icon name="moreH" size={14} /></button>
              </div>
              <div className="serif" style={{ fontSize: 22, lineHeight: 1.1, marginBottom: 6, letterSpacing: "-0.01em" }}>{g.name}</div>
              <div style={{ fontSize: 13, color: "var(--ink-3)", marginBottom: 18, minHeight: 40 }}>{g.description}</div>
              <div style={{ display: "flex", gap: 24, paddingTop: 14, borderTop: "1px solid var(--rule)" }}>
                <div>
                  <div style={{ fontSize: 10, letterSpacing: ".12em", textTransform: "uppercase", color: "var(--ink-3)" }}>Members</div>
                  <div className="serif" style={{ fontSize: 22, marginTop: 2, letterSpacing: "-0.01em" }}>{g.memberCount}</div>
                </div>
                <div>
                  <div style={{ fontSize: 10, letterSpacing: ".12em", textTransform: "uppercase", color: "var(--ink-3)" }}>Documents</div>
                  <div className="serif" style={{ fontSize: 22, marginTop: 2, letterSpacing: "-0.01em" }}>{docCount}</div>
                </div>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
};

// ─── Audit / Notifications / Settings ────────────────────────────────────

const AdminAudit = () => {
  const fakeRows = [
    { who: "Marcus Holloway", role: "Admin", action: "Uploaded document", target: "Quarterly Letter to Investors", ip: "82.41.x.x", time: "Apr 27, 14:22" },
    { who: "Eleanor Whitfield", role: "Client", action: "Downloaded", target: "Capital Account Statement", ip: "203.0.x.x", time: "Apr 27, 11:08" },
    { who: "Marcus Holloway", role: "Admin", action: "Replaced document", target: "Q1 2026 Performance Report (v2)", ip: "82.41.x.x", time: "Apr 24, 09:51" },
    { who: "Charles Pemberton", role: "Client", action: "Downloaded", target: "Portfolio Holdings Detail", ip: "92.18.x.x", time: "Apr 23, 16:34" },
    { who: "Marcus Holloway", role: "Admin", action: "Added user", target: "Theodore Ashby (t.ashby@…)", ip: "82.41.x.x", time: "Apr 22, 10:12" },
    { who: "Sofia Ramírez", role: "Client", action: "Signed in", target: "—", ip: "85.62.x.x", time: "Apr 22, 08:45" },
    { who: "Marcus Holloway", role: "Admin", action: "Created folder", target: "Q1 2026", ip: "82.41.x.x", time: "Apr 12, 09:00" },
  ];
  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">Compliance</div>
          <h1>Audit log</h1>
          <p className="page-sub">Immutable record of every administrative action and document access. Retained for seven years per regulatory requirement.</p>
        </div>
        <button className="btn btn-ghost"><Icon name="download" size={14} /> Export CSV</button>
      </header>
      <div className="card">
        <table className="doc-table">
          <thead>
            <tr><th>Actor</th><th>Action</th><th>Target</th><th>IP</th><th>Time</th></tr>
          </thead>
          <tbody>
            {fakeRows.map((r, i) => (
              <tr key={i}>
                <td>
                  <div className="doc-name">{r.who}</div>
                  <div className="doc-meta">{r.role}</div>
                </td>
                <td><span className="cat-pill">{r.action}</span></td>
                <td style={{ color: "var(--ink-2)" }}>{r.target}</td>
                <td className="mono" style={{ fontSize: 11.5, color: "var(--ink-3)" }}>{r.ip}</td>
                <td className="tnum" style={{ color: "var(--ink-3)", fontSize: 12 }}>{r.time}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
};

const AdminNotifications = () => {
  const [enabled, setEnabled] = React.useState(true);
  const [perDoc, setPerDoc] = React.useState(false);
  const [digestDay, setDigestDay] = React.useState("Friday");

  return (
    <div>
      <header className="page-head" style={{ paddingTop: 0 }}>
        <div>
          <div className="page-eyebrow">System</div>
          <h1>Notifications</h1>
          <p className="page-sub">Configure how investors are notified when new documents are added or replaced.</p>
        </div>
      </header>

      <div style={{ display: "grid", gridTemplateColumns: "1.2fr 1fr", gap: 24, alignItems: "start" }}>
        <div className="card">
          <div className="card-head"><div className="card-title">Email delivery</div></div>
          <div style={{ padding: 24 }}>
            <SettingRow label="Send notifications" sub="Master switch. When off, no emails are sent regardless of other settings.">
              <div className={"toggle " + (enabled ? "on" : "")} onClick={() => setEnabled(!enabled)} />
            </SettingRow>
            <SettingRow label="One email per document" sub="Off = batch into a single email per upload session.">
              <div className={"toggle " + (perDoc ? "on" : "")} onClick={() => setPerDoc(!perDoc)} />
            </SettingRow>
            <SettingRow label="Weekly digest" sub="Summary of all changes from the past week.">
              <select className="select" style={{ width: 140 }} value={digestDay} onChange={(e) => setDigestDay(e.target.value)}>
                <option>Off</option><option>Monday</option><option>Wednesday</option><option>Friday</option>
              </select>
            </SettingRow>
            <SettingRow label="Sender" sub="Reply-to address shown on outgoing emails.">
              <input className="input" defaultValue="ir@codedrips.com" style={{ width: 240 }} />
            </SettingRow>
          </div>
        </div>

        <div className="card">
          <div className="card-head"><div className="card-title">Email preview</div></div>
          <div style={{ padding: 20, background: "var(--paper-2)" }}>
            <div className="card" style={{ padding: 24, background: "var(--paper)" }}>
              <div className="brand" style={{ marginBottom: 20 }}>
                <div className="brand-mark">C</div>
                <div className="brand-name">
                  <span style={{ fontStyle: "italic" }}>CodeDrips</span>
                  <small>Financial Services</small>
                </div>
              </div>
              <div className="serif" style={{ fontSize: 22, lineHeight: 1.2, marginBottom: 14, letterSpacing: "-0.01em" }}>New documents available — Q1 2026</div>
              <p style={{ fontSize: 13, lineHeight: 1.6, color: "var(--ink-2)" }}>
                Dear Eleanor,
              </p>
              <p style={{ fontSize: 13, lineHeight: 1.6, color: "var(--ink-2)" }}>
                Three new documents have been published to your portal for the Q1 2026 reporting period:
              </p>
              <ul style={{ fontSize: 13, lineHeight: 1.7, color: "var(--ink-2)", paddingLeft: 20 }}>
                <li>Quarterly Letter to Investors</li>
                <li>Q1 2026 Performance Report</li>
                <li>Capital Account Statement</li>
              </ul>
              <button className="btn btn-primary btn-sm" style={{ marginTop: 16 }}>Open portal →</button>
              <div style={{ fontSize: 11, color: "var(--ink-4)", marginTop: 24, paddingTop: 14, borderTop: "1px solid var(--rule)" }}>
                You're receiving this because you're a member of LPs — Class A.
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

const SettingRow = ({ label, sub, children }) => (
  <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", padding: "14px 0", borderBottom: "1px solid var(--rule)", gap: 24 }}>
    <div>
      <div style={{ fontSize: 13.5, fontWeight: 500 }}>{label}</div>
      {sub && <div style={{ fontSize: 12, color: "var(--ink-3)", marginTop: 2 }}>{sub}</div>}
    </div>
    {children}
  </div>
);

const AdminSettings = () => (
  <div>
    <header className="page-head" style={{ paddingTop: 0 }}>
      <div>
        <div className="page-eyebrow">System</div>
        <h1>Settings</h1>
        <p className="page-sub">Portal branding, retention policy and integrations.</p>
      </div>
    </header>
    <div className="card">
      <div style={{ padding: 24 }}>
        <SettingRow label="Portal name" sub="Shown in the browser tab and email subject lines.">
          <input className="input" defaultValue="CodeDrips Investor Portal" style={{ width: 280 }} />
        </SettingRow>
        <SettingRow label="Document retention" sub="Documents older than this are moved to cold storage.">
          <select className="select" style={{ width: 160 }} defaultValue="7"><option value="3">3 years</option><option value="7">7 years</option><option value="forever">Indefinite</option></select>
        </SettingRow>
        <SettingRow label="Two-factor required" sub="All users must enroll a second factor on next sign-in.">
          <div className="toggle on" />
        </SettingRow>
        <SettingRow label="Session timeout" sub="Auto sign-out after inactivity.">
          <select className="select" style={{ width: 140 }} defaultValue="30"><option>15 min</option><option>30 min</option><option>1 hour</option></select>
        </SettingRow>
      </div>
    </div>
  </div>
);

// ─── Modals ────────────────────────────────────────────────────────────────

const UploadModal = ({ onClose, onPushToast }) => {
  const data = window.PORTAL_DATA;
  const [over, setOver] = React.useState(false);
  const [files, setFiles] = React.useState([
    { name: "Q1 2026 Performance Report.pdf", size: "1.8 MB", type: "PDF" },
  ]);
  const [period, setPeriod] = React.useState("2026-q1");
  const [date, setDate] = React.useState("2026-04-12");
  const [category, setCategory] = React.useState("Performance");
  const [groups, setGroups] = React.useState(["g_lp_a", "g_lp_b"]);
  const [notify, setNotify] = React.useState(true);

  const submit = () => {
    onPushToast(`Uploaded ${files.length} document${files.length !== 1 ? "s" : ""} to ${data.periods.find(p => p.id === period).label}`);
    onClose();
  };

  return (
    <div className="modal-overlay" onClick={(e) => e.target === e.currentTarget && onClose()}>
      <div className="modal modal-lg">
        <div className="modal-head">
          <div>
            <h3>Upload documents</h3>
            <p>Files are scanned and encrypted at rest.</p>
          </div>
          <button className="iconbtn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="modal-body">
          <div className={"dropzone " + (over ? "over" : "")}
               onDragOver={(e) => { e.preventDefault(); setOver(true); }}
               onDragLeave={() => setOver(false)}
               onDrop={(e) => { e.preventDefault(); setOver(false); }}>
            <Icon name="upload" size={28} stroke={1.25} />
            <div className="dropzone-title">Drop files here</div>
            <div className="dropzone-sub">PDF, XLSX, DOCX, PPTX up to 50 MB each</div>
            <button className="btn btn-ghost btn-sm" style={{ marginTop: 14 }}>Choose files</button>
          </div>

          {files.length > 0 && (
            <div style={{ marginTop: 20 }}>
              <div style={{ fontSize: 11, letterSpacing: ".12em", textTransform: "uppercase", color: "var(--ink-3)", marginBottom: 10 }}>Queued · {files.length}</div>
              {files.map((f, i) => (
                <div key={i} style={{ display: "flex", alignItems: "center", gap: 12, padding: "10px 0", borderBottom: "1px solid var(--rule)" }}>
                  <FileTag type={f.type} />
                  <div style={{ flex: 1 }}>
                    <div className="doc-name" style={{ fontSize: 13.5 }}>{f.name}</div>
                    <div className="doc-meta">{f.size}</div>
                  </div>
                  <div style={{ flex: 1, height: 4, background: "var(--paper-3)", borderRadius: 99, overflow: "hidden", maxWidth: 140 }}>
                    <div style={{ width: "72%", height: "100%", background: "var(--accent)" }} />
                  </div>
                  <button className="iconbtn" onClick={() => setFiles(files.filter((_, j) => j !== i))}><Icon name="x" size={14} /></button>
                </div>
              ))}
            </div>
          )}

          <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16, marginTop: 24 }}>
            <label className="field">
              <span>Reporting period</span>
              <select className="select" value={period} onChange={(e) => setPeriod(e.target.value)}>
                {data.periods.map(p => <option key={p.id} value={p.id}>{p.label}</option>)}
              </select>
            </label>
            <label className="field">
              <span>Document date</span>
              <input className="input" type="date" value={date} onChange={(e) => setDate(e.target.value)} />
            </label>
            <label className="field">
              <span>Category</span>
              <select className="select" value={category} onChange={(e) => setCategory(e.target.value)}>
                {["Letter","Performance","Statement","Holdings","Risk","ESG","Tax","Audit","Annual"].map(c => <option key={c}>{c}</option>)}
              </select>
            </label>
            <label className="field">
              <span>If file exists</span>
              <select className="select" defaultValue="replace">
                <option value="replace">Replace existing</option>
                <option>Keep both versions</option>
                <option>Skip</option>
              </select>
            </label>
          </div>

          <label className="field" style={{ marginTop: 16 }}>
            <span>Visible to groups</span>
            <div style={{ display: "flex", gap: 8, flexWrap: "wrap", marginTop: 6 }}>
              {data.groups.map(g => {
                const on = groups.includes(g.id);
                return (
                  <button key={g.id} className={"chip " + (on ? "selected" : "")} onClick={() => setGroups(on ? groups.filter(x => x !== g.id) : [...groups, g.id])}>
                    {on && <Icon name="check" size={11} stroke={2.5} />}
                    {g.name}
                  </button>
                );
              })}
            </div>
          </label>

          <label className="checkbox" style={{ marginTop: 18, padding: 12, background: "var(--paper-2)", borderRadius: 8 }}>
            <input type="checkbox" checked={notify} onChange={(e) => setNotify(e.target.checked)} />
            <span>Notify {groups.reduce((s, gid) => s + (data.groups.find(g => g.id === gid)?.memberCount || 0), 0)} members by email when published</span>
          </label>
        </div>
        <div className="modal-foot">
          <button className="btn btn-ghost" onClick={onClose}>Cancel</button>
          <button className="btn btn-primary" onClick={submit}><Icon name="check" size={14} /> Publish</button>
        </div>
      </div>
    </div>
  );
};

const UserModal = ({ user, onClose, onPushToast }) => {
  const data = window.PORTAL_DATA;
  const [name, setName] = React.useState(user.name);
  const [email, setEmail] = React.useState(user.email);
  const [entity, setEntity] = React.useState(user.entity);
  const [groups, setGroups] = React.useState([...user.groups]);
  const isNew = !user.id;

  const save = () => {
    onPushToast(isNew ? `Invitation sent to ${email}` : `${name} updated`);
    onClose();
  };

  return (
    <div className="modal-overlay" onClick={(e) => e.target === e.currentTarget && onClose()}>
      <div className="modal modal-lg">
        <div className="modal-head">
          <div>
            <h3>{isNew ? "Add user" : "Edit user"}</h3>
            <p>{isNew ? "An invitation email will be sent on save." : "Changes apply immediately."}</p>
          </div>
          <button className="iconbtn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="modal-body">
          <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16 }}>
            <label className="field"><span>Full name</span><input className="input" value={name} onChange={(e) => setName(e.target.value)} /></label>
            <label className="field"><span>Email</span><input className="input" value={email} onChange={(e) => setEmail(e.target.value)} /></label>
            <label className="field" style={{ gridColumn: "1 / -1" }}><span>Entity</span><input className="input" value={entity} onChange={(e) => setEntity(e.target.value)} /></label>
          </div>
          <label className="field" style={{ marginTop: 16 }}>
            <span>Group membership</span>
            <div style={{ display: "flex", gap: 8, flexWrap: "wrap", marginTop: 6 }}>
              {data.groups.map(g => {
                const on = groups.includes(g.id);
                return (
                  <button key={g.id} className={"chip " + (on ? "selected" : "")} onClick={() => setGroups(on ? groups.filter(x => x !== g.id) : [...groups, g.id])}>
                    {on && <Icon name="check" size={11} stroke={2.5} />}
                    {g.name}
                  </button>
                );
              })}
            </div>
          </label>
          {!isNew && (
            <div style={{ marginTop: 24, padding: 16, background: "var(--paper-2)", borderRadius: 8, fontSize: 12.5, color: "var(--ink-3)", display: "flex", justifyContent: "space-between" }}>
              <span>Last active <strong style={{ color: "var(--ink)" }}>{user.lastActive}</strong></span>
              <span>Status <strong style={{ color: user.status === "active" ? "var(--success)" : "var(--ink-4)" }}>{user.status}</strong></span>
            </div>
          )}
        </div>
        <div className="modal-foot">
          {!isNew && <button className="btn btn-danger btn-sm" style={{ marginRight: "auto" }}><Icon name="trash" size={13} /> Deactivate</button>}
          <button className="btn btn-ghost" onClick={onClose}>Cancel</button>
          <button className="btn btn-primary" onClick={save}>{isNew ? "Send invitation" : "Save changes"}</button>
        </div>
      </div>
    </div>
  );
};

const GroupModal = ({ group, onClose, onPushToast }) => {
  const [name, setName] = React.useState(group.name);
  const [desc, setDesc] = React.useState(group.description);
  const isNew = !group.id;
  const save = () => { onPushToast(isNew ? `Group "${name}" created` : `Group updated`); onClose(); };
  return (
    <div className="modal-overlay" onClick={(e) => e.target === e.currentTarget && onClose()}>
      <div className="modal">
        <div className="modal-head">
          <div>
            <h3>{isNew ? "New group" : "Edit group"}</h3>
            <p>Groups control which users can see which documents.</p>
          </div>
          <button className="iconbtn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="modal-body">
          <label className="field"><span>Name</span><input className="input" value={name} onChange={(e) => setName(e.target.value)} placeholder="e.g. LPs — Class A" /></label>
          <label className="field" style={{ marginTop: 16 }}><span>Description</span><textarea className="textarea" rows={3} value={desc} onChange={(e) => setDesc(e.target.value)} placeholder="What this group is for…" /></label>
        </div>
        <div className="modal-foot">
          <button className="btn btn-ghost" onClick={onClose}>Cancel</button>
          <button className="btn btn-primary" onClick={save}>{isNew ? "Create group" : "Save"}</button>
        </div>
      </div>
    </div>
  );
};

const FolderModal = ({ folder, onClose, onPushToast }) => {
  const [label, setLabel] = React.useState(folder.label || "");
  const [type, setType] = React.useState(folder.type || "quarter");
  const isNew = !folder.id;
  const save = () => { onPushToast(isNew ? `Folder "${label}" created` : `Folder updated`); onClose(); };
  return (
    <div className="modal-overlay" onClick={(e) => e.target === e.currentTarget && onClose()}>
      <div className="modal">
        <div className="modal-head">
          <div>
            <h3>{isNew ? "New folder" : "Edit folder"}</h3>
            <p>Folders represent reporting periods.</p>
          </div>
          <button className="iconbtn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="modal-body">
          <label className="field"><span>Label</span><input className="input" value={label} onChange={(e) => setLabel(e.target.value)} placeholder="e.g. Q2 2026" /></label>
          <label className="field" style={{ marginTop: 16 }}>
            <span>Period type</span>
            <select className="select" value={type} onChange={(e) => setType(e.target.value)}>
              <option value="month">Monthly</option>
              <option value="quarter">Quarterly</option>
              <option value="annual">Annual</option>
            </select>
          </label>
          <div style={{ marginTop: 16, padding: 14, background: "var(--paper-2)", borderRadius: 8, fontSize: 12.5, color: "var(--ink-3)" }}>
            Documents dated within this period will appear here automatically.
          </div>
        </div>
        <div className="modal-foot">
          <button className="btn btn-ghost" onClick={onClose}>Cancel</button>
          <button className="btn btn-primary" onClick={save}>{isNew ? "Create folder" : "Save"}</button>
        </div>
      </div>
    </div>
  );
};

Object.assign(window, { AdminApp });
