// ============================================================
// FitMinds — Schools CRM + Invoices + Enquiries + Content + Users + Calendar + Settings + Login + Portal
// ============================================================

// ---------- SCHOOLS PAGE ----------
function SchoolsPage({ onNav, showToast }) {
  const [search, setSearch] = React.useState("");
  const [selected, setSelected] = React.useState(null);

  const filtered = SCHOOLS.filter(s => s.name.toLowerCase().includes(search.toLowerCase()) || s.address.toLowerCase().includes(search.toLowerCase()));

  return (
    <div className="space-y-6">
      <PageHead
        title="Schools"
        subtitle={`${SCHOOLS.length} schools · ${SCHOOLS.reduce((a, s) => a + s.bookings, 0)} bookings in the book`}
        action={<Button variant="primary" icon="plus">Add school</Button>}
      />

      <div className="flex items-center gap-3">
        <div className="header-search" style={{ flex: 1, maxWidth: 360 }}>
          <Icon name="search" size={16} />
          <input placeholder="Search by name, town…" value={search} onChange={e => setSearch(e.target.value)} />
        </div>
        <button className="filter-pill is-active">All <span className="pill-count">{SCHOOLS.length}</span></button>
        <button className="filter-pill">Active</button>
        <button className="filter-pill">Repeat clients</button>
      </div>

      <div className="grid-3">
        {filtered.map(s => (
          <div key={s.id} className="card card-lift" style={{ padding: 18, cursor: "pointer" }} onClick={() => setSelected(s)}>
            <div className="flex items-center justify-between" style={{ marginBottom: 14 }}>
              <SchoolTile schoolId={s.id} size={46} />
              {s.bookings >= 3 && <Chip tone="violet">Repeat client</Chip>}
            </div>
            <div style={{ fontSize: 15.5, fontWeight: 700 }}>{s.name}</div>
            <div className="muted text-xs" style={{ marginTop: 4 }}>{s.address}</div>
            <hr className="divider" />
            <div className="flex items-center justify-between">
              <div>
                <div className="muted text-xs">Contact</div>
                <div style={{ fontSize: 13, fontWeight: 600, marginTop: 2 }}>{s.contact}</div>
              </div>
              <div style={{ textAlign: "right" }}>
                <div className="muted text-xs">Lifetime</div>
                <div className="tabnum" style={{ fontSize: 13, fontWeight: 700, marginTop: 2 }}>{money(s.lifetime)}</div>
              </div>
            </div>
            <div className="flex items-center gap-2" style={{ marginTop: 14 }}>
              <Chip tone="neutral">{s.bookings} bookings</Chip>
              <button className="btn btn-ghost btn-sm" onClick={(e) => { e.stopPropagation(); onNav("bookings"); }} style={{ marginLeft: "auto" }}>
                <Icon name="plus" size={13} /> Book
              </button>
            </div>
          </div>
        ))}
      </div>

      {selected && <SchoolDrawer school={selected} onClose={() => setSelected(null)} onNav={onNav} />}
    </div>
  );
}

function SchoolDrawer({ school, onClose, onNav }) {
  const history = BOOKINGS.filter(b => b.schoolId === school.id);
  return (
    <div className="scrim" onClick={onClose}>
      <div className="drawer" onClick={e => e.stopPropagation()}>
        <div className="drawer-header">
          <div className="flex items-center gap-3">
            <SchoolTile schoolId={school.id} size={46} />
            <div>
              <div style={{ fontSize: 18, fontWeight: 700 }}>{school.name}</div>
              <div className="muted text-xs">{school.address}</div>
            </div>
          </div>
          <button className="icon-btn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="drawer-body space-y-4">
          <div className="grid-2">
            <MetaRow label="Contact"   value={school.contact} icon="user" />
            <MetaRow label="Phone"     value={school.phone} icon="phone" />
            <MetaRow label="Email"     value={school.email} icon="mail" />
            <MetaRow label="Lifetime"  value={money(school.lifetime)} icon="banknote" />
          </div>

          <div>
            <div className="flex items-center justify-between" style={{ marginBottom: 10 }}>
              <div className="section-heading">Booking history</div>
              <Button size="sm" variant="outline" icon="plus" onClick={() => onNav("bookings")}>New block</Button>
            </div>
            <div className="space-y-3">
              {history.map(b => (
                <div key={b.id} style={{ padding: 12, border: "1px solid var(--border)", borderRadius: 12 }}>
                  <div className="flex items-center justify-between">
                    <div>
                      <div style={{ fontWeight: 600, fontSize: 13.5 }}>{b.title}</div>
                      <div className="muted text-xs">{fmtDate(b.start)} · {b.weeks} weeks</div>
                    </div>
                    <div style={{ textAlign: "right" }}>
                      <StatusChip status={b.status} />
                      <div className="tabnum text-xs muted" style={{ marginTop: 3 }}>{money(b.totalPrice)}</div>
                    </div>
                  </div>
                </div>
              ))}
            </div>
          </div>
        </div>
        <div className="drawer-footer">
          <Button variant="outline" icon="mail">Email</Button>
          <Button variant="primary" icon="plus" onClick={() => onNav("bookings")}>New booking</Button>
        </div>
      </div>
    </div>
  );
}

// ---------- INVOICES PAGE ----------
function InvoicesPage({ showToast, invoiceBooking, setInvoiceBooking }) {
  const [filter, setFilter] = React.useState("all");
  const [preview, setPreview] = React.useState(invoiceBooking || null);
  React.useEffect(() => { if (invoiceBooking) setPreview(invoiceBooking); }, [invoiceBooking]);

  const filtered = INVOICES.filter(i => filter === "all" || i.status === filter);
  const totals = {
    all: INVOICES.reduce((a, i) => a + i.total, 0),
    paid: INVOICES.filter(i => i.status === "paid").reduce((a, i) => a + i.total, 0),
    outstanding: INVOICES.filter(i => i.status === "sent").reduce((a, i) => a + i.total, 0),
    draft: INVOICES.filter(i => i.status === "draft").reduce((a, i) => a + i.total, 0),
  };

  return (
    <div className="space-y-6">
      <PageHead
        title="Invoices"
        subtitle={`${INVOICES.length} invoices · ${money(totals.outstanding)} outstanding`}
        action={<Button variant="primary" icon="sparkles">Generate from booking</Button>}
      />

      <div className="grid-stats">
        <StatCard label="This month"        value={money(1460)} icon="calendar" />
        <StatCard label="Paid"              value={money(totals.paid)} icon="check" tint="mint" />
        <StatCard label="Outstanding"       value={money(totals.outstanding)} icon="clock" tint="sun" />
        <StatCard label="Drafts"            value={totals.draft ? money(totals.draft) : "—"} icon="file" tint="lilac" />
      </div>

      <div className="flex items-center gap-2">
        {["all","paid","sent","draft"].map(k => (
          <button key={k} className={`filter-pill ${filter===k?"is-active":""}`} onClick={() => setFilter(k)}>
            {k[0].toUpperCase()+k.slice(1)}
          </button>
        ))}
      </div>

      <div className="card" style={{ padding: 0, overflow: "hidden" }}>
        <table className="data-table">
          <thead>
            <tr>
              <th style={{ paddingLeft: 20 }}>Invoice</th>
              <th>School</th>
              <th>Issued</th>
              <th>Due</th>
              <th style={{ textAlign: "right" }}>Total</th>
              <th>Status</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            {filtered.map(inv => {
              const s = SCHOOL_BY_ID[inv.schoolId];
              return (
                <tr key={inv.id} onClick={() => setPreview(BOOKING_BY_ID[inv.bookingId])} style={{ cursor: "pointer" }}>
                  <td style={{ paddingLeft: 20 }}><span className="mono" style={{ fontWeight: 600 }}>{inv.id}</span></td>
                  <td>
                    <div className="flex items-center gap-3">
                      <SchoolTile schoolId={inv.schoolId} size={30} />
                      <span style={{ fontWeight: 600, fontSize: 13.5 }}>{s.name}</span>
                    </div>
                  </td>
                  <td className="muted">{fmtDateShort(inv.issued)}</td>
                  <td className="muted">{fmtDateShort(inv.due)}</td>
                  <td style={{ textAlign: "right" }}><span className="tabnum" style={{ fontWeight: 700 }}>{money(inv.total)}</span></td>
                  <td><StatusChip status={inv.status} /></td>
                  <td style={{ width: 44 }}><Icon name="chevron-right" size={16} style={{ color: "var(--muted-foreground)" }} /></td>
                </tr>
              );
            })}
          </tbody>
        </table>
      </div>

      {preview && <InvoiceModal booking={preview} onClose={() => { setPreview(null); setInvoiceBooking && setInvoiceBooking(null); }} showToast={showToast} />}
    </div>
  );
}

function InvoiceModal({ booking, onClose, showToast }) {
  const s = SCHOOL_BY_ID[booking.schoolId];
  const [sent, setSent] = React.useState(false);
  return (
    <div className="modal-scrim" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ width: "min(860px, 100%)" }}>
        <div style={{ padding: "18px 24px", borderBottom: "1px solid var(--border)", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
          <div>
            <div style={{ fontSize: 17, fontWeight: 700 }}>Invoice preview</div>
            <div className="muted text-xs">Auto-generated from booking {booking.id}</div>
          </div>
          <button className="icon-btn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>

        <div style={{ padding: 24, background: "#f3efe9" }}>
          <div className="invoice-paper">
            <div className="invoice-head">
              <div className="invoice-brand">
                <div className="flex items-center gap-3">
                  <BrandMark size={40} />
                  <div>
                    <div className="wordmark">FitMindsCoach</div>
                    <div className="muted text-xs">Inclusive movement coaching · NI</div>
                  </div>
                </div>
                <div style={{ marginTop: 18, fontSize: 12, color: "#6b7280" }}>
                  12 Orchard Park, Belfast BT6<br/>
                  ronan@fitmindscoach.com · 077 1122 3344<br/>
                  VAT not applicable
                </div>
              </div>
              <div className="invoice-meta">
                <div style={{ fontSize: 11, textTransform: "uppercase", letterSpacing: ".08em", fontWeight: 700, color: "#6b7280" }}>Invoice</div>
                <div className="num">INV-2026-021</div>
                <div style={{ marginTop: 14 }}>
                  <div>Issued <span style={{ color: "#1a1c2e" }}>{fmtDate("2026-04-21")}</span></div>
                  <div>Due <span style={{ color: "#1a1c2e" }}>{fmtDate("2026-05-21")}</span></div>
                </div>
              </div>
            </div>

            <div style={{ marginTop: 24, display: "flex", justifyContent: "space-between" }}>
              <div>
                <div style={{ fontSize: 11, textTransform: "uppercase", letterSpacing: ".08em", fontWeight: 700, color: "#6b7280" }}>Billed to</div>
                <div style={{ marginTop: 6, fontWeight: 700 }}>{s.name}</div>
                <div style={{ fontSize: 13, color: "#6b7280" }}>{s.address}</div>
                <div style={{ fontSize: 13, color: "#6b7280" }}>Attn: {s.contact}</div>
              </div>
              <div style={{ textAlign: "right" }}>
                <div style={{ fontSize: 11, textTransform: "uppercase", letterSpacing: ".08em", fontWeight: 700, color: "#6b7280" }}>For period</div>
                <div style={{ marginTop: 6, fontWeight: 700 }}>{fmtDate(booking.start)} → {fmtDate(addWeeks(booking.start, booking.weeks))}</div>
                <div style={{ fontSize: 13, color: "#6b7280" }}>{booking.weeks} weeks · {["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][booking.daysOfWeek[0]]}s at {booking.time}</div>
              </div>
            </div>

            <table className="invoice-table">
              <thead><tr><th>Description</th><th style={{ textAlign: "center" }}>Qty</th><th style={{ textAlign: "right" }}>Rate</th><th style={{ textAlign: "right" }}>Amount</th></tr></thead>
              <tbody>
                <tr>
                  <td>
                    <div style={{ fontWeight: 600 }}>{booking.title}</div>
                    <div style={{ color: "#6b7280", fontSize: 12, marginTop: 3 }}>{booking.duration} min · Inclusive movement coaching · {booking.notes}</div>
                  </td>
                  <td style={{ textAlign: "center" }}>{booking.weeks}</td>
                  <td style={{ textAlign: "right" }} className="tabnum">{money(booking.pricePerSession)}</td>
                  <td style={{ textAlign: "right" }} className="tabnum" style={{ fontWeight: 600, textAlign: "right" }}>{money(booking.totalPrice)}</td>
                </tr>
              </tbody>
            </table>

            <div className="invoice-totals">
              <div className="row"><span style={{ color: "#6b7280" }}>Subtotal</span><span className="tabnum">{money(booking.totalPrice)}</span></div>
              <div className="row"><span style={{ color: "#6b7280" }}>VAT (0%)</span><span className="tabnum">£0</span></div>
              <div className="row total"><span>Total due</span><span className="tabnum">{money(booking.totalPrice)}</span></div>
            </div>

            <div style={{ marginTop: 32, padding: 16, background: "#fbf8f5", borderRadius: 10, fontSize: 12, color: "#6b7280" }}>
              <div style={{ fontWeight: 700, color: "#1a1c2e", marginBottom: 4 }}>Payment details</div>
              Bank transfer: Ulster Bank · sort 98-00-50 · acc 12345678. Reference: {"INV-2026-021"}.<br/>
              Thank you — every session makes a difference.
            </div>
          </div>
        </div>

        <div style={{ padding: 16, borderTop: "1px solid var(--border)", display: "flex", gap: 10, justifyContent: "flex-end", background: "var(--card)" }}>
          <Button variant="ghost" icon="download" onClick={() => showToast("Invoice downloaded as PDF.", "success")}>Download PDF</Button>
          <Button variant="outline" icon="copy">Copy link</Button>
          <Button variant="primary" icon={sent ? "check" : "send"} onClick={() => { setSent(true); showToast("Invoice sent to " + s.email, "success"); }}>
            {sent ? "Sent" : "Send to " + s.email.split("@")[0]}
          </Button>
        </div>
      </div>
    </div>
  );
}

// ---------- ENQUIRIES ----------
function EnquiriesPage() {
  const stages = ["new","contacted","qualified","booked","lost"];
  const stageLabel = { new: "New", contacted: "Contacted", qualified: "Qualified", booked: "Booked", lost: "Lost" };
  const stageTone = { new: "blue", contacted: "amber", qualified: "violet", booked: "green", lost: "neutral" };

  return (
    <div className="space-y-6">
      <PageHead
        title="Enquiries"
        subtitle={`${ENQUIRIES.filter(e => e.stage === "new").length} new · ${ENQUIRIES.length} total this month`}
        action={
          <div className="flex gap-2">
            <Button variant="outline" icon="link">Website form</Button>
            <Button variant="primary" icon="plus">Add lead</Button>
          </div>
        }
      />

      <div className="grid-3" style={{ gridTemplateColumns: "repeat(5, 1fr)", gap: 14 }}>
        {stages.map(st => {
          const items = ENQUIRIES.filter(e => e.stage === st);
          return (
            <div key={st} className="kanban-col">
              <div className="col-head">
                <div className="flex items-center gap-2">
                  <span className="chip-dot" style={{
                    background: st==="new"?"#3b82f6": st==="contacted"?"#f59e0b": st==="qualified"?"#a855f7": st==="booked"?"#22c55e":"#9ca3af"
                  }}></span>
                  <div className="name">{stageLabel[st]}</div>
                </div>
                <span className="pill-count">{items.length}</span>
              </div>
              {items.map(e => (
                <div key={e.id} className="kanban-card">
                  <div className="flex items-center justify-between">
                    <div style={{ fontWeight: 600, fontSize: 13 }}>{e.name}</div>
                    <Icon name="grip-vertical" size={13} style={{ color: "var(--muted-foreground)" }} />
                  </div>
                  <div className="muted text-xs" style={{ marginTop: 2 }}>{e.org}</div>
                  <div style={{ fontSize: 12, marginTop: 8, lineHeight: 1.4 }}>{e.message.slice(0, 90)}{e.message.length > 90 ? "…" : ""}</div>
                  <div className="flex items-center justify-between" style={{ marginTop: 10 }}>
                    <div className="muted text-xs">{fmtDateShort(e.date)}</div>
                    <div className="flex gap-1">
                      <button className="icon-btn" style={{ width: 26, height: 26 }}><Icon name="phone" size={12} /></button>
                      <button className="icon-btn" style={{ width: 26, height: 26 }}><Icon name="mail" size={12} /></button>
                    </div>
                  </div>
                </div>
              ))}
              {items.length === 0 && <div className="muted text-xs" style={{ textAlign: "center", padding: 12 }}>—</div>}
            </div>
          );
        })}
      </div>
    </div>
  );
}

// ---------- CONTENT PORTAL (ADMIN) ----------
function ContentAdminPage({ onSwitchView }) {
  const [activeCat, setActiveCat] = React.useState("all");
  const visible = VIDEOS.filter(v => activeCat === "all" || v.cat === activeCat);

  return (
    <div className="space-y-6">
      <PageHead
        title="Content Portal"
        subtitle={`${VIDEOS.length} videos across ${VIDEO_CATEGORIES.length} sections · 1,284 views this month`}
        action={
          <div className="flex gap-2">
            <Button variant="outline" icon="external-link" onClick={onSwitchView}>Preview as parent</Button>
            <Button variant="primary" icon="upload">Upload video</Button>
          </div>
        }
      />

      <div className="grid-stats" style={{ gridTemplateColumns: "repeat(4, 1fr)" }}>
        {VIDEO_CATEGORIES.map(c => (
          <div key={c.id} className="card card-lift" style={{ padding: 18, cursor: "pointer" }} onClick={() => setActiveCat(c.id)}>
            <div className="flex items-center justify-between">
              <div className={"stat-icon tint-" + c.color} style={{ position: "static" }}>
                <Icon name={c.icon} size={17} style={{ color: "#fff" }} />
              </div>
              <span className="tabnum" style={{ fontSize: 22, fontWeight: 700 }}>{c.count}</span>
            </div>
            <div style={{ marginTop: 10, fontSize: 14, fontWeight: 600 }}>{c.label}</div>
            <div className="muted text-xs" style={{ marginTop: 2 }}>videos in library</div>
          </div>
        ))}
      </div>

      <div className="flex items-center gap-2 flex-wrap">
        <button className={`filter-pill ${activeCat==="all"?"is-active":""}`} onClick={() => setActiveCat("all")}>All <span className="pill-count">{VIDEOS.length}</span></button>
        {VIDEO_CATEGORIES.map(c => (
          <button key={c.id} className={`filter-pill ${activeCat===c.id?"is-active":""}`} onClick={() => setActiveCat(c.id)}>
            {c.label} <span className="pill-count">{c.count}</span>
          </button>
        ))}
      </div>

      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(250px, 1fr))", gap: 16 }}>
        {visible.map(v => (
          <div key={v.id} className="video-tile">
            <div className="video-thumb" style={{ background: THUMB_ART[v.art - 1] }}>
              <span className="duration">{v.duration}</span>
              <div className="play"><span><Icon name="play" size={20} /></span></div>
            </div>
            <div className="video-body">
              <div className="video-title">{v.title}</div>
              <div className="video-meta">
                <Chip tone="neutral">{VIDEO_CATEGORIES.find(c => c.id === v.cat).label}</Chip>
                <span>·</span>
                <span className="tabnum">{v.views} views</span>
              </div>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

// ---------- USERS ----------
function UsersPage() {
  const [tab, setTab] = React.useState("all");
  const visible = USERS.filter(u => {
    if (tab === "all") return true;
    if (tab === "admin") return u.role.includes("Admin");
    if (tab === "teacher") return u.role === "Teacher";
    if (tab === "parent") return u.role === "Parent";
  });

  return (
    <div className="space-y-6">
      <PageHead
        title="Users"
        subtitle={`${USERS.length} accounts · ${USERS.filter(u => u.status === "active").length} active`}
        action={<Button variant="primary" icon="user-plus">Invite user</Button>}
      />

      <div className="grid-stats">
        <StatCard label="Admins"   value={USERS.filter(u => u.role.includes("Admin")).length} icon="shield-check" />
        <StatCard label="Teachers" value={USERS.filter(u => u.role === "Teacher").length} icon="graduation-cap" tint="mint" />
        <StatCard label="Parents"  value={USERS.filter(u => u.role === "Parent").length} icon="heart" tint="sun" />
        <StatCard label="Content viewed" value="1,284" icon="eye" tint="lilac" delta={{dir:"up",text:"+12% vs last month"}} />
      </div>

      <Tabs
        value={tab} onChange={setTab}
        tabs={[
          { value: "all", label: "All " + USERS.length },
          { value: "admin", label: "Admins" },
          { value: "teacher", label: "Teachers" },
          { value: "parent", label: "Parents" },
        ]}
      />

      <div className="card" style={{ padding: 0, overflow: "hidden" }}>
        <table className="data-table">
          <thead><tr>
            <th style={{ paddingLeft: 20 }}>User</th><th>Role</th><th>Last active</th><th>Content viewed</th><th>Status</th><th></th>
          </tr></thead>
          <tbody>
            {visible.map(u => (
              <tr key={u.id}>
                <td style={{ paddingLeft: 20 }}>
                  <div className="flex items-center gap-3">
                    <div className="avatar" style={{ width: 34, height: 34 }}>{u.avatar}</div>
                    <div>
                      <div style={{ fontWeight: 600 }}>{u.name}</div>
                      <div className="muted text-xs">{u.email}</div>
                    </div>
                  </div>
                </td>
                <td><Chip tone={u.role.includes("Admin") ? "violet" : u.role === "Teacher" ? "mint" : "blue"}>{u.role}</Chip></td>
                <td className="muted">{u.lastActive}</td>
                <td className="tabnum">{u.content !== null ? u.content + " videos" : "—"}</td>
                <td><StatusChip status={u.status} /></td>
                <td style={{ width: 44 }}><Icon name="more-horizontal" size={16} style={{ color: "var(--muted-foreground)" }} /></td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
}

// ---------- CALENDAR PAGE (month view) ----------
function CalendarPage({ bookings, onOpen }) {
  // Month: April 2026. 1st = Wed.
  const month = "April 2026";
  const firstDow = 3; // Wed
  const daysInMonth = 30;
  const cells = [];
  for (let i = 0; i < firstDow; i++) cells.push(null);
  for (let d = 1; d <= daysInMonth; d++) cells.push(d);
  while (cells.length % 7 !== 0) cells.push(null);

  const eventsForDay = (d) => {
    if (!d) return [];
    const iso = `2026-04-${String(d).padStart(2,"0")}`;
    // derive day of week for April 2026: April 1 = Wed (3)
    const dow = (firstDow + d - 1) % 7;
    return bookings.filter(b => {
      if (!b.daysOfWeek.includes(dow)) return false;
      const start = b.start;
      const end = addWeeks(b.start, b.weeks);
      return iso >= start && iso < end;
    });
  };

  return (
    <div className="space-y-6">
      <PageHead
        title="Calendar"
        subtitle="All bookings, sessions, and school blocks — in one view."
        action={
          <div className="flex gap-2">
            <Button variant="outline" icon="download">Sync Google</Button>
            <Button variant="primary" icon="plus">New event</Button>
          </div>
        }
      />

      <div className="card" style={{ padding: 18 }}>
        <div className="flex items-center justify-between" style={{ marginBottom: 14 }}>
          <div>
            <div className="section-heading">Month</div>
            <div style={{ fontSize: 22, fontWeight: 700, letterSpacing: "-0.02em", marginTop: 2 }}>{month}</div>
          </div>
          <div className="flex gap-2">
            <button className="icon-btn"><Icon name="chevron-left" size={16} /></button>
            <button className="btn btn-outline btn-sm">Today</button>
            <button className="icon-btn"><Icon name="chevron-right" size={16} /></button>
            <div className="tabs-row" style={{ marginLeft: 8 }}>
              <button className="tab">Day</button>
              <button className="tab">Week</button>
              <button className="tab is-active">Month</button>
            </div>
          </div>
        </div>

        <div className="calendar-grid" style={{ gridTemplateColumns: "repeat(7, 1fr)" }}>
          {["Mon","Tue","Wed","Thu","Fri","Sat","Sun"].map(d => (
            <div key={d} className="cal-cell" style={{ background: "oklch(0 0 0 / 2%)", textAlign: "center", padding: "10px 0", minHeight: 0 }}>
              <div className="dname" style={{ fontSize: 10.5, fontWeight: 700, textTransform: "uppercase", letterSpacing: ".06em", color: "var(--muted-foreground)" }}>{d}</div>
            </div>
          ))}
          {cells.map((d, i) => {
            // Adjust: calendar header above starts Mon. We used Wed = 3 for April 1st so if we want Mon-first, shift:
            // leave Sunday-first for simplicity: firstDow already = Wed index (3)
            const events = eventsForDay(d);
            const isToday = d === 21;
            return (
              <div key={i} className="cal-cell" style={{ minHeight: 110, padding: 6, opacity: d ? 1 : 0.4, background: isToday ? "oklch(.66 .18 35 / .06)" : "var(--card)" }}>
                {d && (
                  <div className="flex items-center justify-between" style={{ marginBottom: 6 }}>
                    <div className="tabnum" style={{ fontSize: 13, fontWeight: isToday ? 700 : 500, color: isToday ? "var(--primary)" : "inherit" }}>{d}</div>
                    {events.length > 0 && <span className="muted text-xs">{events.length}</span>}
                  </div>
                )}
                {events.slice(0, 3).map(b => (
                  <div key={b.id + i} className={"cal-event " + schoolEvtClass(b.schoolId)} onClick={() => onOpen(b)}>
                    <div className="truncate">{SCHOOL_BY_ID[b.schoolId].short} · {b.time}</div>
                  </div>
                ))}
              </div>
            );
          })}
        </div>

        <div className="flex gap-3 flex-wrap" style={{ marginTop: 14 }}>
          {SCHOOLS.slice(0,4).map((s, i) => (
            <div key={s.id} className="flex items-center gap-2 text-xs">
              <span className="chip-dot" style={{ background: s.color, width: 9, height: 9 }}></span>
              <span className="muted">{s.name}</span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

// ---------- SIMPLE REPORTS & SETTINGS ----------
function ReportsPage() {
  return (
    <div className="space-y-6">
      <PageHead title="Reports" subtitle="Revenue, bookings, and engagement over time." />
      <div className="grid-stats">
        <StatCard label="Total revenue YTD" value={money(14820)} icon="banknote" />
        <StatCard label="Blocks delivered" value="34" icon="calendar-check-2" tint="mint" />
        <StatCard label="Repeat rate" value="72%" icon="repeat" tint="sun" delta={{dir:"up", text:"+8 pts"}} />
        <StatCard label="Avg block value" value={money(285)} icon="tag" tint="lilac" />
      </div>
      <div className="card" style={{ padding: 24 }}>
        <div className="section-heading">Revenue by school · last 12 months</div>
        <div className="space-y-3" style={{ marginTop: 16 }}>
          {SCHOOLS.map(s => {
            const pct = Math.round((s.lifetime / 3600) * 100);
            return (
              <div key={s.id}>
                <div className="flex items-center justify-between" style={{ marginBottom: 6 }}>
                  <div className="flex items-center gap-3"><SchoolTile schoolId={s.id} size={28} /><span style={{ fontSize: 13, fontWeight: 600 }}>{s.name}</span></div>
                  <span className="tabnum text-sm" style={{ fontWeight: 600 }}>{money(s.lifetime)}</span>
                </div>
                <div className="progress"><span style={{ width: pct + "%", background: s.color }} /></div>
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
}

function SettingsPage({ brand, setBrand }) {
  return (
    <div className="space-y-6">
      <PageHead title="Settings" subtitle="Profile, branding, team, and white-label." />
      <div className="grid-5-2">
        <div className="card" style={{ padding: 22 }}>
          <div className="section-heading" style={{ marginBottom: 14 }}>Brand / white-label</div>
          <div className="grid-2">
            <Field label="Organisation name"><input className="input" value={brand.name} onChange={e => setBrand({ ...brand, name: e.target.value })} /></Field>
            <Field label="Tagline"><input className="input" value={brand.tagline} onChange={e => setBrand({ ...brand, tagline: e.target.value })} /></Field>
          </div>
          <div style={{ marginTop: 16 }}>
            <div className="field-label">Primary colour</div>
            <div className="swatch-row">
              {[
                { hex: "oklch(0.66 0.18 35)",  name: "FitMinds Coral" },
                { hex: "oklch(0.60 0.20 260)", name: "Indigo" },
                { hex: "oklch(0.60 0.17 165)", name: "Forest" },
                { hex: "oklch(0.55 0.18 300)", name: "Plum" },
                { hex: "oklch(0.65 0.17 220)", name: "Ocean" },
                { hex: "oklch(0.60 0.20 25)",  name: "Scarlet" },
              ].map(c => (
                <div key={c.hex} className={"swatch " + (brand.primary === c.hex ? "is-active" : "")} style={{ background: c.hex }} onClick={() => setBrand({ ...brand, primary: c.hex })} title={c.name}></div>
              ))}
            </div>
          </div>
          <div style={{ marginTop: 16, padding: 12, background: "var(--muted)", borderRadius: 11, fontSize: 12, color: "var(--muted-foreground)" }}>
            <Icon name="info" size={13} style={{ marginRight: 6, verticalAlign: "middle" }} />
            White-label is on. The portal, invoices, and parent emails will all use your branding.
          </div>
        </div>

        <div className="card" style={{ padding: 22 }}>
          <div className="section-heading" style={{ marginBottom: 14 }}>Preferences</div>
          <div className="space-y-4">
            <div className="flex items-center justify-between">
              <div><div style={{ fontWeight: 600, fontSize: 13.5 }}>Auto-invoice on booking</div><div className="muted text-xs">Generates a draft invoice as soon as a booking is created.</div></div>
              <Switch on={true} onChange={()=>{}} />
            </div>
            <div className="flex items-center justify-between">
              <div><div style={{ fontWeight: 600, fontSize: 13.5 }}>Google Calendar sync</div><div className="muted text-xs">Two-way sync with ronan@fitmindscoach.com</div></div>
              <Switch on={true} onChange={()=>{}} />
            </div>
            <div className="flex items-center justify-between">
              <div><div style={{ fontWeight: 600, fontSize: 13.5 }}>Public booking widget</div><div className="muted text-xs">Allow schools to self-book from your website.</div></div>
              <Switch on={false} onChange={()=>{}} />
            </div>
            <div className="flex items-center justify-between">
              <div><div style={{ fontWeight: 600, fontSize: 13.5 }}>Weekly summary email</div><div className="muted text-xs">Every Sunday at 18:00.</div></div>
              <Switch on={true} onChange={()=>{}} />
            </div>
          </div>
        </div>
      </div>

      <div className="card" style={{ padding: 22 }}>
        <div className="flex items-center justify-between" style={{ marginBottom: 14 }}>
          <div className="section-heading" style={{ margin: 0 }}>Test logins</div>
          <Chip tone="amber"><Icon name="key-round" size={11} /> Prototype only</Chip>
        </div>
        <div className="muted text-xs" style={{ marginBottom: 14 }}>
          Use these credentials to sign in as each role while the site is in progress. All three use the same password for easy sharing. Change them in <code style={{ background: "var(--muted)", padding: "1px 6px", borderRadius: 5 }}>Data.jsx → AUTH_USERS</code>.
        </div>
        <div style={{ border: "1px solid var(--border)", borderRadius: 11, overflow: "hidden" }}>
          <div className="flex items-center" style={{ padding: "10px 14px", background: "var(--muted)", fontSize: 11.5, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.04em", color: "var(--muted-foreground)" }}>
            <div style={{ flex: "0 0 180px" }}>Role</div>
            <div style={{ flex: 1 }}>Email</div>
            <div style={{ flex: "0 0 180px" }}>Password</div>
          </div>
          {AUTH_USERS.map(u => (
            <div key={u.email} className="flex items-center" style={{ padding: "12px 14px", borderTop: "1px solid var(--border)", fontSize: 13 }}>
              <div style={{ flex: "0 0 180px", fontWeight: 600 }}>{AUTH_ROLE_LABELS[u.role] || u.role}</div>
              <div style={{ flex: 1, fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace" }}>{u.email}</div>
              <div style={{ flex: "0 0 180px", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace" }}>{u.password}</div>
            </div>
          ))}
        </div>
        <div className="muted text-xs" style={{ marginTop: 12, display: "flex", alignItems: "flex-start", gap: 6 }}>
          <Icon name="alert-triangle" size={13} style={{ marginTop: 2, flexShrink: 0 }} />
          <span>Client-side auth only — anyone with browser dev tools can read these. Fine for gating a prototype, not real security. Swap for server-side auth before any real launch.</span>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, {
  SchoolsPage, InvoicesPage, InvoiceModal, EnquiriesPage, ContentAdminPage,
  UsersPage, CalendarPage, ReportsPage, SettingsPage,
});
