/* ============================================================
   SUPER ADMIN (Elephant Ed Admin) views -> window.SuperAdmin
   ============================================================ */
(function () {
  const { useState, useEffect } = React;
  const D = window.DATA;

  const NAV = [
  { id: 'overview', label: 'Overview', icon: 'grid' },
  { id: 'courses', label: 'Courses', icon: 'course', count: D.courses.length },
  { section: 'Platform' },
  { id: 'settings', label: 'Settings', icon: 'settings' }];


  const PAGE_META = {
    overview: { crumb: 'Elephant Ed · Platform', title: 'Platform Overview' },
    courses: { crumb: 'Elephant Ed · Library', title: 'Course Library' },
    settings: { crumb: 'Elephant Ed', title: 'Settings' }
  };

  /* ---------- OVERVIEW ---------- */
  function Overview({ toast }) {
    const p = D.platform;
    const [drawerWp, setDrawerWp] = useState(null);
    const months = ['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May'];
    const topWp = [...D.workplaces].sort((a, b) => b.completion - a.completion);
    return (
      <div className="fade-in">
      <div className="grid" style={{ gridTemplateColumns: 'repeat(4,1fr)', marginBottom: 16 }}>
        <StatCard icon="building" label="Workplaces" value={p.workplaces} sub="active clients" />
        <StatCard icon="users" iconBg="#E4F5EC" iconColor="#1E9E6A" label="Learners" value="2,508" trend="+6%" trendDir="up" sub="vs last month" />
        <StatCard icon="checkc" iconBg="#E7EFFB" iconColor="#2160C4" label="Completions" value="4,120" trend="+12%" trendDir="up" sub="all time" />
        <StatCard icon="gauge" iconBg="#FBF1DD" iconColor="#C9821C" label="Avg completion" value="76" unit="%" sub="across platform" />
      </div>

      <div className="grid" style={{ gridTemplateColumns: '1fr', marginBottom: 16 }}>
        <div className="card pad">
          <SectionHead kicker="Last 12 months" title="Completion rate trend" />
          <BarChart data={p.monthly} height={150} labels={months} />
        </div>
      </div>

      <div className="card">
        <div className="pad" style={{ paddingBottom: 0 }}>
          <SectionHead title="Workplaces">
            <button className="btn ghost sm" onClick={() => toast('Filters — Workplace · Course')}><Icon n="filter" size={15} />Filter</button>
            <button className="btn subtle sm" onClick={() => toast('Platform report exported (CSV)')}><Icon n="download" size={15} />Export</button>
          </SectionHead>
        </div>
        <div className="table-wrap">
          <table className="tbl">
            <thead><tr>
              <th>Workplace</th><th>Industry</th><th>Learners</th><th>Courses</th><th style={{ width: 220 }}>Completion</th><th></th>
            </tr></thead>
            <tbody>
              {topWp.map((w) =>
                <tr key={w.id} className="clickable" onClick={() => setDrawerWp(w)}>
                  <td><div className="row gap12"><Avatar name={w.name} size="av-sm" color="#1E4FA8" /><span className="td-strong">{w.name}</span></div></td>
                  <td className="muted">{w.industry}</td>
                  <td className="num">{w.employees}</td>
                  <td className="num">{w.courses}</td>
                  <td><ProgressMini value={w.completion} /></td>
                  <td><span style={{ color: 'var(--faint)' }}><Icon n="chevr" size={16} /></span></td>
                </tr>
                )}
            </tbody>
          </table>
        </div>
      </div>

      {drawerWp && <WorkplaceDrawer wp={drawerWp} onClose={() => setDrawerWp(null)} toast={toast} />}
    </div>);

  }

  /* ---------- WORKPLACE DETAIL DRAWER ---------- */
  function WorkplaceDrawer({ wp, onClose, toast }) {
    useEffect(() => {
      const h = (e) => {if (e.key === 'Escape') onClose();};
      window.addEventListener('keydown', h);
      return () => window.removeEventListener('keydown', h);
    }, []);
    const courses = D.courses.filter((c) => c.workplaces.includes(wp.id));
    return (
      <>
      <div className="drawer-scrim" onClick={onClose}></div>
      <aside className="drawer">
        <div className="drawer-head">
          <div className="row gap8" style={{ justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 16 }}>
            <div className="kicker">Workplace</div>
            <button className="icon-btn" style={{ width: 32, height: 32, border: 0, background: 'var(--surface-2)' }} onClick={onClose}><Icon n="x" size={16} /></button>
          </div>
          <div className="row gap12">
            <Avatar name={wp.name} size="av-md" color="#1E4FA8" />
            <div style={{ minWidth: 0 }}>
              <h2 className="h-sec" style={{ marginBottom: 3 }}>{wp.name}</h2>
              <div className="td-sub">{wp.industry}</div>
            </div>
          </div>
        </div>
        <div className="drawer-body">
          <div className="drawer-statrow" style={{ marginBottom: 24 }}>
            <div className="drawer-stat"><div className="dv">{wp.employees}</div><div className="dl">Learners</div></div>
            <div className="drawer-stat"><div className="dv">{courses.length}</div><div className="dl">Courses</div></div>
            <div className="drawer-stat"><div className="dv">{wp.completion}<em style={{ fontSize: 13, fontStyle: 'normal', color: 'var(--muted)' }}>%</em></div><div className="dl">Completion</div></div>
          </div>

          <div className="kicker" style={{ marginBottom: 8 }}>Admin</div>
          <div className="card pad" style={{ background: 'var(--surface-2)', padding: '14px 16px', marginBottom: 26 }}>
            <div className="row gap12">
              <Avatar name={wp.admin} size="av-sm" />
              <div style={{ minWidth: 0 }}>
                <div className="td-strong">{wp.admin}</div>
                {wp.adminEmail && <div className="mono muted" style={{ fontSize: 12 }}>{wp.adminEmail}</div>}
              </div>
            </div>
          </div>

          <div className="row gap8" style={{ justifyContent: 'space-between', marginBottom: 6 }}>
            <div className="kicker">Courses distributed</div>
            <span className="lbl">{courses.length}</span>
          </div>
          <div>
            {courses.map((c) => {const cur = c.versions.find((v) => v.current) || c.versions[0];return (
                  <div key={c.id} className="drawer-course">
                <Swatch course={c} size={38} font={14} />
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div className="td-strong" style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{c.name}</div>
                  <div className="td-sub">{c.cat} · v{cur.v}</div>
                </div>
                <Badge status={cur.status} />
              </div>);
              })}
            {courses.length === 0 && <div className="muted" style={{ textAlign: 'center', padding: '24px 0', fontSize: 13 }}>No courses distributed yet.</div>}
          </div>

          <button className="btn ghost sm" style={{ marginTop: 22, width: '100%', justifyContent: 'center' }} onClick={() => toast('Opening ' + wp.name)}>Manage workplace<Icon n="chevr" size={14} /></button>
        </div>
      </aside>
    </>);

  }

  /* ---------- COURSE LIBRARY + DETAIL ---------- */
  function Courses({ toast }) {
    const [detail, setDetail] = useState(null);
    const [upload, setUpload] = useState(null); // course for upload modal
    return (
      <div className="fade-in">
      <SectionHead kicker={D.courses.length + ' courses'} title="All courses">
        <button className="btn ghost sm"><Icon n="filter" size={15} />Filter</button>
        <button className="btn primary sm" onClick={() => toast('New course — name & first SCORM upload')}><Icon n="plus" size={15} />New course</button>
      </SectionHead>
      <div className="grid" style={{ gridTemplateColumns: 'repeat(3,1fr)' }}>
        {D.courses.map((c) => {
            const cur = c.versions.find((v) => v.current) || c.versions[0];
            return (
              <div key={c.id} className="course-card" onClick={() => setDetail(c)} style={{ cursor: 'pointer' }}>
              <div className="course-banner" style={{ background: c.color }}>
                <span className="cat">{c.cat}</span>
              </div>
              <div style={{ padding: '16px 18px 18px', display: 'flex', flexDirection: 'column', flex: 1 }}>
                <div className="row gap8" style={{ justifyContent: 'space-between', marginBottom: 8 }}>
                  <Badge status={cur.status} />
                  <span className="lbl">v{cur.v}</span>
                </div>
                <h3 className="h-card" style={{ marginBottom: 7 }}>{c.name}</h3>
                <p className="muted" style={{ fontSize: 13, lineHeight: 1.5, margin: 0, flex: 1 }}>{c.desc}</p>
                <div className="row gap16" style={{ marginTop: 15, paddingTop: 14, borderTop: '1px solid var(--border)' }}>
                  <span className="row gap8" style={{ fontSize: 12.5, color: 'var(--muted)' }}><Icon n="building" size={15} />{c.workplaces.length} workplaces</span>
                  <span className="row gap8" style={{ fontSize: 12.5, color: 'var(--muted)' }}><Icon n="clock" size={15} />{c.mins} min</span>
                </div>
              </div>
            </div>);

          })}
      </div>

      {detail && <CourseDetail course={detail} onClose={() => setDetail(null)} toast={toast} upload={upload} setUpload={setUpload} />}
    </div>);

  }

  function CourseDetail({ course, onClose, toast, upload, setUpload }) {
    const [tab, setTab] = useState('versions');
    const [distOpen, setDistOpen] = useState(false);
    const [shellOpen, setShellOpen] = useState(false);
    useEffect(() => {
      const h = (e) => {if (e.key === 'Escape') onClose();};
      window.addEventListener('keydown', h);
      return () => window.removeEventListener('keydown', h);
    }, []);
    const cur = course.versions.find((v) => v.current) || course.versions[0];
    return (
      <>
      <div className="drawer-scrim" onClick={onClose}></div>
      <aside className="drawer wide">
        <div className="drawer-head">
          <div className="row gap16" style={{ alignItems: 'flex-start' }}>
            <Swatch course={course} size={56} font={20} radius="13px" />
            <div style={{ flex: 1, minWidth: 0 }}>
              <div className="kicker" style={{ marginBottom: 5 }}>{course.cat}</div>
              <h2 className="h-sec" style={{ fontSize: 22, marginBottom: 7 }}>{course.name}</h2>
              <p className="muted" style={{ margin: 0, fontSize: 13.5, lineHeight: 1.5 }}>{course.desc}</p>
            </div>
            <button className="icon-btn" style={{ width: 32, height: 32, border: 0, background: 'var(--surface-2)' }} onClick={onClose}><Icon n="x" size={16} /></button>
          </div>
          <div className="row gap8" style={{ marginTop: 16 }}>
            <span className="pop-anchor">
              <button className="btn ghost sm" onClick={() => setShellOpen((o) => !o)} disabled={cur.status === 'draft'}><Icon n="package" size={15} />SCORM Shell</button>
              {shellOpen && <ShellPopover course={course} toast={toast} onClose={() => setShellOpen(false)} />}
            </span>
            <span className="pop-anchor">
              <button className="btn primary sm" onClick={() => setDistOpen((o) => !o)} disabled={cur.status === 'draft'}><Icon n="send" size={15} />Distribute</button>
              {distOpen && <DistributePopover course={course} toast={toast} onClose={() => setDistOpen(false)} />}
            </span>
          </div>
        </div>
        <div className="drawer-body">
          <div className="grid" style={{ gridTemplateColumns: 'repeat(2,1fr)', marginBottom: 22 }}>
            <StatCard label="Current version" value={'v' + cur.v} sub={cur.status} />
            <StatCard label="Distributed to" value={course.workplaces.length} unit="workplaces" />
            <StatCard label="Duration" value={course.mins} unit="min" />
            <StatCard label="Pass mark" value={course.hasScore ? course.pass : '—'} unit={course.hasScore ? '%' : ''} sub={course.hasScore ? 'scored' : 'completion only'} />
          </div>

          <div className="utabs" style={{ marginBottom: 18 }}>
            <button className={tab === 'versions' ? 'active' : ''} onClick={() => setTab('versions')}>Versions</button>
            <button className={tab === 'dist' ? 'active' : ''} onClick={() => setTab('dist')}>Distribution</button>
          </div>

          {tab === 'versions' &&
            <div className="card">
              <div className="pad" style={{ paddingBottom: 14 }}>
                <SectionHead kicker="Articulate SCORM 1.2" title="Version history">
                  <button className="btn primary sm" onClick={() => setUpload(course)}><Icon n="upload" size={15} />Upload</button>
                </SectionHead>
              </div>
              <div className="table-wrap">
                <table className="tbl">
                  <thead><tr><th>Version</th><th>Status</th><th>Size</th><th>Published</th><th></th></tr></thead>
                  <tbody>
                    {course.versions.map((v) =>
                    <tr key={v.v}>
                        <td><span className="td-strong">v{v.v}</span>{v.current && <span className="pill-soft" style={{ marginLeft: 8 }}>Current</span>}</td>
                        <td><Badge status={v.status} /></td>
                        <td className="num muted">{v.size}</td>
                        <td className="muted">{v.date}</td>
                        <td>
                          <div className="row gap8" style={{ justifyContent: 'flex-end' }}>
                            {v.status === 'draft' && <button className="btn primary sm" onClick={() => toast('Validated ✓  v' + v.v + ' published')}><Icon n="check" size={14} />Publish</button>}
                            <button className="btn ghost sm" onClick={() => toast('Downloading original package ' + v.file)}><Icon n="download" size={14} /></button>
                          </div>
                        </td>
                      </tr>
                    )}
                  </tbody>
                </table>
              </div>
              <div className="pad" style={{ borderTop: '1px solid var(--border)', display: 'flex', gap: 10, alignItems: 'center', color: 'var(--muted)', fontSize: 12.5 }}>
                <Icon n="info" size={16} /> Existing completions stay valid when a new version is published. In-progress learners continue the version they started.
              </div>
            </div>
            }

          {tab === 'dist' &&
            <div className="card">
              <div className="pad" style={{ paddingBottom: 14 }}>
                <SectionHead kicker={course.workplaces.length + ' workplaces'} title="Distributed to">
                  <span className="pop-anchor">
                    <button className="btn primary sm" onClick={() => setDistOpen((o) => !o)}><Icon n="plus" size={15} />Distribute</button>
                    {distOpen && <DistributePopover course={course} toast={toast} onClose={() => setDistOpen(false)} />}
                  </span>
                </SectionHead>
              </div>
              <div className="table-wrap">
                <table className="tbl">
                  <thead><tr><th>Workplace</th><th>Industry</th><th>Learners</th><th></th></tr></thead>
                  <tbody>
                    {course.workplaces.map((wid) => {const w = D.wpById(wid);return (
                        <tr key={wid}>
                        <td><div className="row gap12"><Avatar name={w.name} size="av-sm" color="#1E4FA8" /><span className="td-strong">{w.name}</span></div></td>
                        <td className="muted">{w.industry}</td>
                        <td className="num">{w.employees}</td>
                        <td><button className="btn ghost sm" onClick={() => toast('Withdrawn from ' + w.name + ' — history preserved')}>Withdraw</button></td>
                      </tr>);
                    })}
                    {course.workplaces.length === 0 && <tr><td colSpan={4} style={{ textAlign: 'center', color: 'var(--faint)', padding: 34 }}>Not distributed yet — publish a version first.</td></tr>}
                  </tbody>
                </table>
              </div>
            </div>
            }
        </div>
      </aside>

      {upload && <UploadModal course={upload} onClose={() => setUpload(null)} toast={toast} />}
    </>);

  }

  /* ---------- MODALS ---------- */
  function UploadModal({ course, onClose, toast }) {
    const [stage, setStage] = useState('drop'); // drop -> validating -> done
    const [hot, setHot] = useState(false);
    const start = () => {
      setStage('validating');
      setTimeout(() => setStage('done'), 1700);
    };
    return (
      <Modal kicker={course.name} title="Upload Course Version" onClose={onClose}
      footer={stage === 'done' ?
      <><button className="btn ghost" onClick={onClose}>Close</button><button className="btn primary" onClick={() => {toast('v1.4 saved as draft — ready to publish');onClose();}}><Icon n="check" size={16} />Save as draft</button></> :
      <><button className="btn ghost" onClick={onClose}>Cancel</button></>}>
      {stage === 'drop' &&
        <div className={'dropzone' + (hot ? ' hot' : '')}
        onDragOver={(e) => {e.preventDefault();setHot(true);}} onDragLeave={() => setHot(false)}
        onDrop={(e) => {e.preventDefault();setHot(false);start();}} onClick={start}>
          <Icon n="upload" />
          <div className="h-card" style={{ margin: '12px 0 4px' }}>Drop Articulate SCORM package</div>
          <div className="muted" style={{ fontSize: 13 }}>SCORM 1.2 · single launchable course · max 500 MB</div>
          <button className="btn ghost sm" style={{ marginTop: 16 }}>Browse files</button>
        </div>
        }
      {stage === 'validating' &&
        <div style={{ textAlign: 'center', padding: '24px 0' }}>
          <div style={{ width: 46, height: 46, margin: '0 auto 16px', border: '3px solid var(--surface-3)', borderTopColor: 'var(--brand)', borderRadius: '50%', animation: 'spin 0.8s linear infinite' }}></div>
          <div className="h-card">Validating package…</div>
          <div className="muted" style={{ fontSize: 13, marginTop: 5 }}>Checking manifest, launch file & SCORM 1.2 conformance</div>
          <style>{'@keyframes spin{to{transform:rotate(360deg)}}'}</style>
        </div>
        }
      {stage === 'done' &&
        <div>
          <div className="row gap12" style={{ padding: '14px 16px', background: 'var(--ok-bg)', borderRadius: 10, marginBottom: 18 }}>
            <span style={{ color: 'var(--ok)' }}><Icon n="checkc" size={22} /></span>
            <div><div style={{ fontWeight: 600, color: 'var(--navy)' }}>Package valid</div><div className="muted" style={{ fontSize: 12.5 }}>SCORM 1.2 · 1 launchable item · resume tracking detected</div></div>
          </div>
          <div className="grid" style={{ gridTemplateColumns: '1fr 1fr', gap: 14 }}>
            <div><div className="lbl" style={{ marginBottom: 5 }}>File</div><div style={{ fontSize: 13.5 }}>{course.abbr.toLowerCase()}_v1-4.zip</div></div>
            <div><div className="lbl" style={{ marginBottom: 5 }}>Size</div><div style={{ fontSize: 13.5 }}>49.6 MB</div></div>
            <div><div className="lbl" style={{ marginBottom: 5 }}>Version</div><div style={{ fontSize: 13.5 }}>v1.4 (draft)</div></div>
            <div><div className="lbl" style={{ marginBottom: 5 }}>Launch file</div><div style={{ fontSize: 13.5 }}>story.html</div></div>
          </div>
        </div>
        }
    </Modal>);

  }

  function DistributePopover({ course, onClose, toast }) {
    const avail = D.workplaces.filter((w) => !course.workplaces.includes(w.id));
    const [sel, setSel] = useState([]);
    const toggle = (id) => setSel((s) => s.includes(id) ? s.filter((x) => x !== id) : [...s, id]);
    useEffect(() => {
      const h = (e) => {if (e.key === 'Escape') onClose();};
      window.addEventListener('keydown', h);
      return () => window.removeEventListener('keydown', h);
    }, []);
    return (
      <>
      <div className="pop-scrim" onClick={onClose}></div>
      <div className="pop" onClick={(e) => e.stopPropagation()}>
        <div className="pop-head">
          <div className="td-strong" style={{ fontSize: 14 }}>Distribute to workplaces</div>
          <div className="td-sub">Adds this course to each workplace's catalogue.</div>
        </div>
        <div className="pop-body">
          {avail.map((w) =>
            <label key={w.id} className="row gap12" style={{ padding: '9px 11px', border: '1px solid var(--border)', borderRadius: 9, cursor: 'pointer', background: sel.includes(w.id) ? 'var(--info-bg)' : 'var(--surface)' }}>
              <input type="checkbox" checked={sel.includes(w.id)} onChange={() => toggle(w.id)} style={{ width: 16, height: 16, accentColor: '#2160C4' }} />
              <Avatar name={w.name} size="av-sm" color="#1E4FA8" />
              <div style={{ minWidth: 0 }}><div className="td-strong" style={{ fontSize: 13 }}>{w.name}</div><div className="td-sub">{w.industry}</div></div>
            </label>
            )}
          {avail.length === 0 && <div className="muted" style={{ textAlign: 'center', padding: '14px 0', fontSize: 13 }}>Already distributed to all workplaces.</div>}
        </div>
        <div className="pop-foot">
          <button className="btn ghost sm" onClick={onClose}>Cancel</button>
          <button className="btn primary sm" disabled={!sel.length} onClick={() => {toast(`Distributed to ${sel.length} workplace${sel.length > 1 ? 's' : ''}`);onClose();}}><Icon n="send" size={14} />Distribute{sel.length ? ` (${sel.length})` : ''}</button>
        </div>
      </div>
    </>);

  }

  function ShellPopover({ course, onClose, toast }) {
    useEffect(() => {
      const h = (e) => {if (e.key === 'Escape') onClose();};
      window.addEventListener('keydown', h);
      return () => window.removeEventListener('keydown', h);
    }, []);
    return (
      <>
      <div className="pop-scrim" onClick={onClose}></div>
      <div className="pop" onClick={(e) => e.stopPropagation()}>
        <div className="pop-head">
          <div className="td-strong" style={{ fontSize: 14 }}>Export SCORM shell</div>
          <div className="td-sub">A lightweight package a workplace uploads to their own LMS — on launch it redirects the learner to Elephant Ed.</div>
        </div>
        <div className="pop-body" style={{ gap: 0 }}>
          <div className="row gap8" style={{ justifyContent: 'space-between', padding: '4px 2px' }}>
            <span className="lbl">Package</span>
            <span className="mono" style={{ fontSize: 12.5 }}>{course.abbr.toLowerCase()}_shell.zip</span>
          </div>
        </div>
        <div className="pop-foot">
          <button className="btn ghost sm" onClick={onClose}>Cancel</button>
          <button className="btn primary sm" onClick={() => {toast('SCORM Shell exported — ' + course.abbr.toLowerCase() + '_shell.zip');onClose();}}><Icon n="download" size={14} />Export (.zip)</button>
        </div>
      </div>
    </>);

  }

  function Placeholder({ title }) {
    return <div className="fade-in card pad" style={{ textAlign: 'center', padding: 60, color: 'var(--faint)' }}>
    <Icon n="settings" size={34} /><div className="h-card" style={{ marginTop: 14 }}>{title}</div>
    <div className="muted" style={{ fontSize: 13, marginTop: 6 }}>Out of scope for this prototype.</div>
  </div>;
  }

  function SuperAdmin({ page, toast }) {
    switch (page) {
      case 'overview':return <Overview toast={toast} />;
      case 'courses':return <Courses toast={toast} />;
      default:return <Placeholder title="Settings" />;
    }
  }

  window.SuperAdmin = { Component: SuperAdmin, NAV, PAGE_META, user: { name: 'Avery Sloan', role: 'Elephant Ed Admin', color: '#15A6C9' } };
})();