/* Student-facing views — home, take assessment (recorder), reports.
   Recording UI has 3 variants (Tweak): radial, wave, minimal. */

function StudentHome({ me, reports, setView }) {
  if (!reports || reports.length === 0) {
    return (
      <div className="fade-up">
        <div className="page-head">
          <div>
            <div className="eyebrow mb-2">Welcome, {me && me.name ? me.name.split(' ')[0] : 'Student'}</div>
            <h1 className="page-title">Your <em>progress</em></h1>
            <div className="page-sub">No evaluations yet. Take your first assessment below.</div>
          </div>
          <button className="btn btn-accent" onClick={() => setView('student_take')}>
            <Icon name="mic" size={13}/> Take new assessment
          </button>
        </div>
      </div>
    );
  }
  const latest = reports[reports.length - 1];
  const trend = reports.map((r, i) => ({ label: `#${i + 1}`, value: r.scores.overall }));
  const avg = Math.round(reports.reduce((a, r) => a + r.scores.overall, 0) / reports.length);
  const best = Math.max(...reports.map((r) => r.scores.overall));

  return (
    <div className="fade-up">
      <div className="page-head">
        <div>
          <div className="eyebrow mb-2">Welcome back, {me.name.split(' ')[0]}</div>
          <h1 className="page-title">Your <em>progress</em></h1>
          <div className="page-sub">{reports.length} evaluations · averaging {avg}/100 · your personal best is {best}</div>
        </div>
        <button className="btn btn-accent" onClick={() => setView('student_take')}>
          <Icon name="mic" size={13}/> Take new assessment
        </button>
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 12, marginBottom: 16 }}>
        {[
          { k: 'Latest score',  v: latest.scores.overall, sub: latest.grade.label, spark: reports.slice(-5).map((r) => r.scores.overall), c: '--viz-1' },
          { k: 'Average',       v: avg, sub: gradeOf(avg).label, c: '--viz-4' },
          { k: 'Personal best', v: best, sub: 'all-time', c: '--viz-6' },
        ].map((s, i) => (
          <div key={i} className="fade-up" style={{
            animationDelay: `${i * 0.06}s`,
            padding: '16px 18px', background: 'var(--card)',
            border: '1px solid var(--rule)', borderRadius: 'var(--radius-lg)',
            borderTop: `3px solid var(${s.c})`,
          }}>
            <div className="eyebrow" style={{ color: `var(${s.c})` }}>{s.k}</div>
            <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', marginTop: 6 }}>
              <div className="serif tnum" style={{ fontSize: 44, lineHeight: 1, color: `var(${s.c})` }}>{s.v}</div>
              {s.spark && <Sparkline data={s.spark} width={80} height={28} stroke={`var(${s.c})`}/>}
            </div>
            <div style={{ fontSize: 11.5, color: 'var(--ink-4)', marginTop: 6 }}>{s.sub}</div>
          </div>
        ))}
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: '1.3fr 1fr', gap: 14 }}>
        <div className="card">
          <div className="card-hd"><span className="card-title">Progress over time</span></div>
          <div className="card-pad"><TrendLine data={trend} width={540} height={200}/></div>
        </div>
        <div className="card">
          <div className="card-hd"><span className="card-title">Available slots</span><button className="btn btn-ghost btn-sm" style={{ marginLeft: 'auto' }} onClick={() => setView('student_take')}>View all</button></div>
          <div>
            <div style={{ padding: '12px 14px', color: 'var(--ink-4)', fontSize: 12 }}>
              <span style={{ cursor: 'pointer', color: 'var(--accent)' }} onClick={() => setView('student_take')}>Browse open assessments →</span>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

function StudentTakeAssessment({ slots, setView, onBegin }) {
  const [passkeyInput, setPasskeyInput] = React.useState('');
  const [passkeySearching, setPasskeySearching] = React.useState(false);
  const [passkeyErr, setPasskeyErr] = React.useState('');
  const [unlockedSlots, setUnlockedSlots] = React.useState({}); // { slotId: true }
  const [showPasskeyEntry, setShowPasskeyEntry] = React.useState(false);

  // Split slots: open (no passkey) vs passkey-gated
  const openSlots    = slots.filter((s) => s.status === 'open' && !s.passkey);
  const lockedSlots  = slots.filter((s) => s.status === 'open' && s.passkey);
  const unlockedList = lockedSlots.filter((s) => unlockedSlots[s.id]);

  // Try to unlock a slot by passkey — calls verify endpoint to find matching slot
  const tryUnlockByCode = async () => {
    const code = passkeyInput.trim().toUpperCase();
    if (!code) { setPasskeyErr('Enter a passkey code first.'); return; }
    setPasskeySearching(true); setPasskeyErr('');
    // Try each locked slot that hasn't been unlocked yet
    const toTry = lockedSlots.filter((s) => !unlockedSlots[s.id]);
    let found = false;
    for (const s of toTry) {
      try {
        await apiFetch(`/slots/${s.id}/verify-passkey`, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ passkey: code }),
        });
        setUnlockedSlots((prev) => ({ ...prev, [s.id]: true }));
        found = true;
        break;
      } catch { /* try next */ }
    }
    setPasskeySearching(false);
    if (!found) {
      setPasskeyErr('Passkey does not match any available assessment. Check with your faculty and try again.');
    } else {
      setPasskeyInput('');
      setShowPasskeyEntry(false);
      window.__toast && window.__toast('Assessment unlocked! You can now begin.', 'ok');
    }
  };

  return (
    <div className="fade-up">
      <div className="page-head">
        <div>
          <div className="eyebrow mb-2">Student portal</div>
          <h1 className="page-title">Available <em>assessments</em></h1>
          <div className="page-sub">Select an open assessment to begin. Passkey-protected assessments are only visible after entering your faculty's passkey.</div>
        </div>
        {lockedSlots.length > 0 && (
          <div>
            <button className="btn btn-sm btn-primary" onClick={() => setShowPasskeyEntry(true)}>
              <Icon name="lock" size={12}/> Enter passkey
            </button>
          </div>
        )}
      </div>

      {/* Passkey entry panel */}
      {(showPasskeyEntry || (lockedSlots.length > 0 && openSlots.length === 0)) && (
        <div className="fade-in" style={{
          padding: '16px 18px', marginBottom: 16, fontSize: 12,
          background: 'color-mix(in oklab, var(--accent) 5%, transparent)',
          border: '1px solid color-mix(in oklab, var(--accent) 22%, var(--rule))',
          borderRadius: 'var(--radius-lg)',
        }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10 }}>
            <Icon name="lock" size={14} style={{ color: 'var(--accent)' }}/>
            <span style={{ fontWeight: 600, color: 'var(--ink-2)' }}>Enter your session passkey</span>
            <span style={{ color: 'var(--ink-4)', fontSize: 11 }}>Your faculty will share this at the start of the session</span>
            {showPasskeyEntry && (
              <button className="btn btn-ghost btn-sm" style={{ marginLeft: 'auto', padding: 4 }} onClick={() => { setShowPasskeyEntry(false); setPasskeyErr(''); }}>
                <Icon name="close" size={12}/>
              </button>
            )}
          </div>
          <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
            <input
              className="input mono"
              value={passkeyInput}
              onChange={(e) => { setPasskeyInput(e.target.value.toUpperCase()); setPasskeyErr(''); }}
              placeholder="ABCD1234"
              maxLength={10}
              style={{ flex: 1, letterSpacing: '0.12em', fontSize: 16, textAlign: 'center', textTransform: 'uppercase' }}
              onKeyDown={(e) => e.key === 'Enter' && tryUnlockByCode()}
            />
            <button className="btn btn-primary" onClick={tryUnlockByCode} disabled={passkeySearching || !passkeyInput}>
              {passkeySearching ? 'Checking…' : <><Icon name="arrowRight" size={12}/> Unlock</>}
            </button>
          </div>
          {passkeyErr && (
            <div style={{ marginTop: 6, fontSize: 11, color: 'var(--bad)' }}>{passkeyErr}</div>
          )}
        </div>
      )}

      {/* No passkey notice if locked slots exist but user hasn't entered one */}
      {lockedSlots.length > 0 && !showPasskeyEntry && unlockedList.length < lockedSlots.length && (
        <div className="fade-in" style={{
          padding: '10px 14px', marginBottom: 14, fontSize: 11.5, color: 'var(--ink-3)',
          background: 'var(--paper-2)', border: '1px solid var(--rule)', borderRadius: 'var(--radius)',
          display: 'flex', alignItems: 'center', gap: 10,
        }}>
          <Icon name="lock" size={13} style={{ color: 'var(--ink-4)' }}/>
          <span>
            <b>{lockedSlots.length - unlockedList.length} passkey-protected assessment{lockedSlots.length - unlockedList.length !== 1 ? 's' : ''}</b> available — ask your faculty for the passkey, then click "Enter passkey" to access {lockedSlots.length - unlockedList.length !== 1 ? 'them' : 'it'}.
          </span>
          <button className="btn btn-sm" style={{ marginLeft: 'auto' }} onClick={() => setShowPasskeyEntry(true)}>
            <Icon name="lock" size={11}/> Enter passkey
          </button>
        </div>
      )}

      {/* Open (no passkey) slots */}
      {openSlots.length > 0 && (
        <>
          {unlockedList.length > 0 && <div className="eyebrow mb-2" style={{ marginTop: 8 }}>Open assessments</div>}
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: 12 }} className="stagger">
            {openSlots.map((s) => {
              const used = s.myAttempts != null ? s.myAttempts : (s.my_attempts != null ? s.my_attempts : 0);
              const max  = s.attempts   != null ? s.attempts   : (s.max_attempts != null ? s.max_attempts : null);
              const exhausted = max !== null && used >= max;
              return (
                <div key={s.id} className="card card-pad" style={{ cursor: exhausted ? 'not-allowed' : 'pointer', opacity: exhausted ? 0.6 : 1 }}
                  onClick={() => !exhausted && onBegin(s)}>
                  <div style={{ display: 'flex', gap: 8, marginBottom: 10, flexWrap: 'wrap' }}>
                    <span className="pill pill-ok pill-live"><span className="pill-dot"/>Open</span>
                    {exhausted && <span className="pill pill-bad">Limit reached</span>}
                  </div>
                  <div className="serif" style={{ fontSize: 18, lineHeight: 1.3, marginBottom: 10 }}>{s.title}</div>
                  <div style={{ fontSize: 11.5, color: 'var(--ink-4)', marginBottom: 14 }}>
                    Closes {fmtDate(s.expires)} · {max ? `${used}/${max} attempt${max > 1 ? 's' : ''}` : 'Unlimited attempts'}
                  </div>
                  <button className="btn btn-primary btn-sm" disabled={exhausted} style={{ width: '100%', justifyContent: 'center', opacity: exhausted ? 0.5 : 1 }}>
                    {exhausted ? <><Icon name="lock" size={12}/> Attempts exhausted</> : <><Icon name="mic" size={12}/> Begin evaluation</>}
                  </button>
                </div>
              );
            })}
          </div>
        </>
      )}

      {/* Unlocked passkey slots */}
      {unlockedList.length > 0 && (
        <>
          <div className="eyebrow mb-2" style={{ marginTop: 14, color: 'var(--accent)' }}>
            <Icon name="lock" size={10}/> Unlocked assessments
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: 12 }} className="stagger">
            {unlockedList.map((s) => {
              const used = s.myAttempts != null ? s.myAttempts : (s.my_attempts != null ? s.my_attempts : 0);
              const max  = s.attempts   != null ? s.attempts   : (s.max_attempts != null ? s.max_attempts : null);
              const exhausted = max !== null && used >= max;
              return (
                <div key={s.id} className="card card-pad" style={{ cursor: exhausted ? 'not-allowed' : 'pointer', opacity: exhausted ? 0.6 : 1, borderTop: '2px solid var(--accent)' }}
                  onClick={() => !exhausted && onBegin(s)}>
                  <div style={{ display: 'flex', gap: 8, marginBottom: 10, flexWrap: 'wrap' }}>
                    <span className="pill pill-ok pill-live"><span className="pill-dot"/>Open</span>
                    <span className="pill pill-accent"><Icon name="check" size={10}/>Unlocked</span>
                    {exhausted && <span className="pill pill-bad">Limit reached</span>}
                  </div>
                  <div className="serif" style={{ fontSize: 18, lineHeight: 1.3, marginBottom: 10 }}>{s.title}</div>
                  <div style={{ fontSize: 11.5, color: 'var(--ink-4)', marginBottom: 14 }}>
                    Closes {fmtDate(s.expires)} · {max ? `${used}/${max} attempt${max > 1 ? 's' : ''}` : 'Unlimited attempts'}
                  </div>
                  <button className="btn btn-primary btn-sm" disabled={exhausted} style={{ width: '100%', justifyContent: 'center', opacity: exhausted ? 0.5 : 1 }}>
                    {exhausted ? <><Icon name="lock" size={12}/> Attempts exhausted</> : <><Icon name="mic" size={12}/> Begin evaluation</>}
                  </button>
                </div>
              );
            })}
          </div>
        </>
      )}

      {openSlots.length === 0 && unlockedList.length === 0 && lockedSlots.length === 0 && (
        <div style={{ padding: '48px 0', textAlign: 'center', color: 'var(--ink-4)', fontSize: 13 }}>
          No open assessments available right now. Check back later.
        </div>
      )}
    </div>
  );
}

function RecorderPanel({ variant = 'radial', recording, seconds, onToggle, onStop }) {
  const max = 180;
  const pct = Math.min(1, seconds / max);
  const mm = String(Math.floor(seconds / 60)).padStart(2, '0');
  const ss = String(seconds % 60).padStart(2, '0');

  if (variant === 'minimal') {
    return (
      <div style={{ padding: '32px 24px', textAlign: 'center' }}>
        <div className="serif tnum" style={{ fontSize: 64, lineHeight: 1, color: recording ? 'var(--accent)' : 'var(--ink)', fontVariantNumeric: 'tabular-nums' }}>
          {mm}:{ss}
        </div>
        <div className="mt-2 eyebrow">{recording ? 'Recording' : 'Paused'} · max 3 min</div>
        <div style={{ height: 1, background: 'var(--rule)', margin: '20px 0 16px', position: 'relative' }}>
          <div style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: `${pct * 100}%`, background: 'var(--accent)' }}/>
        </div>
        <div style={{ display: 'flex', gap: 10, justifyContent: 'center' }}>
          <button className="btn btn-accent btn-lg" onClick={onToggle}>
            <Icon name={recording ? 'pause' : 'mic'} size={14}/>
            {recording ? 'Pause' : 'Start recording'}
          </button>
          {recording || seconds > 0 ? (
            <button className="btn btn-lg" onClick={onStop}><Icon name="stop" size={14}/> Stop</button>
          ) : null}
        </div>
      </div>
    );
  }

  if (variant === 'wave') {
    return (
      <div style={{ padding: '24px', textAlign: 'center' }}>
        <div style={{ padding: '20px 0', borderTop: '1px solid var(--rule)', borderBottom: '1px solid var(--rule)', marginBottom: 20 }}>
          <Waveform active={recording} bars={48}/>
        </div>
        <div className="serif tnum" style={{ fontSize: 48, lineHeight: 1, color: recording ? 'var(--accent)' : 'var(--ink)' }}>{mm}:{ss}</div>
        <div className="mt-2 eyebrow">{recording ? 'Recording' : 'Ready'}</div>
        <div style={{ marginTop: 20, display: 'flex', gap: 10, justifyContent: 'center' }}>
          <button className="btn btn-accent btn-lg" onClick={onToggle}>
            <Icon name={recording ? 'pause' : 'mic'} size={14}/>
            {recording ? 'Pause' : 'Start'}
          </button>
          <button className="btn btn-lg" onClick={onStop} disabled={!recording && !seconds}><Icon name="stop" size={14}/> Stop</button>
        </div>
      </div>
    );
  }

  // radial (default)
  const size = 220, r = 96, c = 2 * Math.PI * r;
  return (
    <div style={{ padding: '24px', display: 'grid', placeItems: 'center' }}>
      <div style={{ position: 'relative', width: size, height: size }}>
        <svg width={size} height={size} style={{ transform: 'rotate(-90deg)' }}>
          <circle cx={size/2} cy={size/2} r={r} fill="none" stroke="var(--rule)" strokeWidth="4"/>
          <circle cx={size/2} cy={size/2} r={r} fill="none" stroke="var(--accent)" strokeWidth="4"
            strokeDasharray={c} strokeDashoffset={c - pct * c} strokeLinecap="round"
            style={{ transition: 'stroke-dashoffset 0.3s' }}/>
        </svg>
        <button onClick={onToggle}
          style={{
            position: 'absolute', inset: 36, borderRadius: '50%',
            background: recording ? 'var(--accent)' : 'var(--ink)', color: '#fff',
            border: 'none', cursor: 'pointer', display: 'grid', placeItems: 'center',
            boxShadow: recording ? '0 0 0 8px var(--accent-wash)' : 'var(--shadow-2)',
            transition: 'background .2s, box-shadow .3s',
            animation: recording ? 'pulseRec 1.4s ease infinite' : 'none',
          }}>
          <Icon name={recording ? 'pause' : 'mic'} size={32}/>
        </button>
        <style>{`@keyframes pulseRec { 0%,100% { box-shadow: 0 0 0 0 var(--accent-wash); } 50% { box-shadow: 0 0 0 16px transparent; } }`}</style>
      </div>
      <div className="serif tnum" style={{ fontSize: 32, marginTop: 20, color: recording ? 'var(--accent)' : 'var(--ink)' }}>{mm}:{ss}</div>
      <div className="eyebrow" style={{ marginTop: 4 }}>{recording ? 'Recording · tap to pause' : seconds ? 'Paused' : 'Tap to start'}</div>
      <div style={{ marginTop: 16, height: 20 }}>
        <Waveform active={recording} bars={32}/>
      </div>
      <div style={{ marginTop: 16, display: 'flex', gap: 10 }}>
        <button className="btn" onClick={onStop} disabled={!recording && !seconds}><Icon name="stop" size={12}/> End recording</button>
      </div>
    </div>
  );
}

function EvaluationFlow({ slot, setView, onDone, recUI = 'radial', user }) {
  const isSuperAdmin = user?.role === 'superadmin' || user?.role === 'admin';

  // For superadmin: start at student selection step (-1), else start at topic (0)
  const [step, setStep] = React.useState(isSuperAdmin ? -1 : 0);
  const [topic, setTopic] = React.useState('');
  const [self, setSelf] = React.useState({ q1: 5, q2: 5, q3: 5 });
  const [recording, setRecording] = React.useState(false);
  const [seconds, setSeconds] = React.useState(0);
  const [procStep, setProcStep] = React.useState(0);
  const [procErr, setProcErr] = React.useState('');

  // Superadmin: selected student from DB
  const [studentList, setStudentList] = React.useState([]);
  const [studentSearch, setStudentSearch] = React.useState('');
  const [selectedStudent, setSelectedStudent] = React.useState(null);
  const [loadingStudents, setLoadingStudents] = React.useState(false);

  // Audio upload (superadmin only)
  const [uploadedFile, setUploadedFile] = React.useState(null);
  const uploadRef = React.useRef(null);

  React.useEffect(() => {
    if (!isSuperAdmin) return;
    setLoadingStudents(true);
    apiFetch('/auth/admin/users')
      .then((users) => {
        const students = (Array.isArray(users) ? users : []).filter((u) => u.role === 'user' && u.is_active);
        setStudentList(students);
      })
      .catch(() => setStudentList([]))
      .finally(() => setLoadingStudents(false));
  }, [isSuperAdmin]);

  const mediaRef = React.useRef(null);
  const chunksRef = React.useRef([]);
  const streamRef = React.useRef(null);

  React.useEffect(() => {
    if (!recording) return;
    const i = setInterval(() => setSeconds((s) => {
      if (s >= 179) { handleStop(); return 180; }
      return s + 1;
    }), 1000);
    return () => clearInterval(i);
  }, [recording]);

  const handleToggle = async () => {
    if (!recording) {
      try {
        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
        streamRef.current = stream;
        const mr = new MediaRecorder(stream);
        mediaRef.current = mr;
        chunksRef.current = [];
        mr.ondataavailable = (e) => { if (e.data.size > 0) chunksRef.current.push(e.data); };
        mr.start(1000);
        setRecording(true);
      } catch (ex) {
        alert('Microphone access denied or unavailable. Please allow microphone access and try again.');
      }
    } else {
      // pause not supported well — just treat as stop if re-clicked
      handleStop();
    }
  };

  const handleStop = () => {
    if (!mediaRef.current) { setRecording(false); setStep('review'); return; }
    // requestData() forces the browser to flush any buffered audio into
    // ondataavailable BEFORE stop() fires onstop — prevents empty blobs
    // on browsers that don't auto-flush on stop (Safari, some Android).
    try { mediaRef.current.requestData(); } catch (_) {}
    mediaRef.current.onstop = () => {
      streamRef.current?.getTracks().forEach((t) => t.stop());
      // Verify we actually captured audio before moving to review
      const totalBytes = chunksRef.current.reduce((s, c) => s + c.size, 0);
      if (totalBytes === 0) {
        alert('No audio was captured. Please check your microphone and try again.');
        setStep(2);
        return;
      }
      setStep('review');
    };
    mediaRef.current.stop();
    setRecording(false);
  };

  const MAX_POLL_ATTEMPTS = 120;

  const submitEvaluation = async (attempt = 0) => {
    setProcErr('');

    // Determine audio source: uploaded file or recorded chunks
    let audioBlob;
    let audioFileName = 'recording.webm';
    if (uploadedFile) {
      audioBlob = uploadedFile;
      audioFileName = uploadedFile.name;
    } else {
      // Detect correct MIME type — Safari records as audio/mp4, not audio/webm
      const mimeType = mediaRef.current?.mimeType || 'audio/webm';
      const ext = mimeType.includes('mp4') ? 'mp4' : mimeType.includes('ogg') ? 'ogg' : 'webm';
      audioFileName = `recording.${ext}`;
      audioBlob = new Blob(chunksRef.current, { type: mimeType });
    }

    // Guard: refuse to upload a 0-byte blob (saves a round-trip + clear error)
    if (!audioBlob || audioBlob.size === 0) {
      setProcErr('No audio data found. Please re-record and try again.');
      setStep('review');
      return;
    }

    // Determine student info: selected student (superadmin) or logged-in user
    const studentInfo = (isSuperAdmin && selectedStudent) ? {
      name: selectedStudent.name,
      reg:  selectedStudent.reg_number || 'UNKNOWN',
      dept: selectedStudent.department || 'Unknown',
      college: selectedStudent.college || '',
    } : {
      name:    user?.name    || 'Student',
      reg:     user?.regNo   || user?.reg_number || 'UNKNOWN',
      dept:    user?.dept    || user?.department  || 'Unknown',
      college: user?.college || '',
    };

    const fd = new FormData();
    fd.append('file',   audioBlob, audioFileName);
    fd.append('name',   studentInfo.name);
    fd.append('reg',    studentInfo.reg);
    fd.append('dept',   studentInfo.dept);
    fd.append('topic',  topic);
    fd.append('slot_id',  String(slot?.id || ''));
    fd.append('college',  studentInfo.college);
    fd.append('faculty',  isSuperAdmin ? (user?.name || '') : '');
    fd.append('context',  '');
    fd.append('self_score_speaking',   String(self.q1 || 0));
    fd.append('self_score_confidence', String(self.q2 || 0));
    fd.append('self_score_fillers',    String(self.q3 || 0));

    try {
      const token = localStorage.getItem('ca_token') || '';
      const submitRes = await fetch(`${API_BASE}/evaluate`, {
        method: 'POST',
        headers: token ? { Authorization: `Bearer ${token}` } : {},
        body: fd,
      });
      if (!submitRes.ok) {
        let msg = `Server error ${submitRes.status}`;
        try { const j = await submitRes.json(); msg = j.detail?.message || j.detail || msg; } catch {}
        throw new Error(msg);
      }
      const { job_id } = await submitRes.json();
      if (!job_id) throw new Error('No job ID returned from server.');

      let polls = 0;
      while (polls < MAX_POLL_ATTEMPTS) {
        await new Promise((r) => setTimeout(r, 2500));
        polls++;
        const pollRes = await fetch(`${API_BASE}/jobs/${job_id}`, {
          headers: token ? { Authorization: `Bearer ${token}` } : {},
        });
        if (!pollRes.ok) continue;
        const pollData = await pollRes.json();
        setProcStep(Math.min(3, Math.floor(polls / 5)));
        if (pollData.status === 'complete') {
          const report = normaliseApiReport(pollData.result);
          setStep(4);
          onDone(report);
          return;
        }
        if (pollData.status === 'failed') throw new Error(pollData.error || 'Evaluation failed on the server.');
      }
      throw new Error('Evaluation timed out. Please try again.');
    } catch (ex) {
      if (attempt < 2) {
        setProcStep(0);
        await new Promise((r) => setTimeout(r, 5000));
        submitEvaluation(attempt + 1);
      } else {
        setProcErr(ex.message || 'Evaluation failed after retries.');
      }
    }
  };

  React.useEffect(() => {
    if (step !== 3) return;
    const steps = ['Transcribing audio', 'Analysing delivery', 'Scoring criteria', 'Composing verdict'];
    let idx = 0;
    setProcStep(0);
    const t = setInterval(() => {
      idx++;
      if (idx >= steps.length) { clearInterval(t); return; }
      setProcStep(idx);
    }, 4000);
    return () => clearInterval(t);
  }, [step]);

  const Step = ({ n, label, active, done }) => (
    <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
      <div style={{
        width: 24, height: 24, borderRadius: '50%',
        border: `1.5px solid ${done || active ? 'var(--accent)' : 'var(--rule-2)'}`,
        background: done ? 'var(--accent)' : active ? 'var(--card)' : 'transparent',
        color: done ? '#fff' : active ? 'var(--accent)' : 'var(--ink-4)',
        display: 'grid', placeItems: 'center', fontSize: 11, fontFamily: 'var(--f-mono)',
        transition: 'all .3s',
      }}>{done ? '✓' : n}</div>
      <span style={{ fontSize: 12, color: done || active ? 'var(--ink)' : 'var(--ink-4)', fontWeight: active ? 600 : 400 }}>{label}</span>
    </div>
  );

  return (
    <div className="fade-up">
      <button className="btn btn-ghost btn-sm mb-3" onClick={() => setView('student_take')}>
        <Icon name="arrowLeft" size={12}/> All slots
      </button>

      <div className="page-head" style={{ marginBottom: 16 }}>
        <div>
          <div className="eyebrow mb-2">Active evaluation</div>
          <h1 className="page-title">{slot.title}</h1>
          {isSuperAdmin && selectedStudent && (
            <div style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 4 }}>
              Evaluating: <b>{selectedStudent.name}</b> · {selectedStudent.reg_number} · {selectedStudent.department}
            </div>
          )}
        </div>
        <span className="pill pill-ok pill-live"><span className="pill-dot"/>Live session</span>
      </div>

      {/* step bar */}
      <div className="card card-pad mb-4" style={{ display: 'flex', alignItems: 'center', gap: 20, flexWrap: 'wrap' }}>
        {(isSuperAdmin ? ['Student', 'Topic', 'Self-assess', 'Record', 'Process', 'Report'] : ['Topic', 'Self-assess', 'Record', 'Process', 'Report']).map((l, i) => {
          const stepNum = isSuperAdmin ? i - 1 : i;
          return (
            <React.Fragment key={l}>
              {i > 0 && <div style={{ width: 24, height: 1, background: step > stepNum - 1 ? 'var(--accent)' : 'var(--rule)' }}/>}
              <Step n={i + 1} label={l} active={step === stepNum} done={step > stepNum} />
            </React.Fragment>
          );
        })}
      </div>

      {/* ── Superadmin: Student selection step ── */}
      {step === -1 && (
        <div className="card card-pad fade-in">
          <div className="eyebrow mb-3">Step 1 · Select student</div>
          <div style={{ fontSize: 13, color: 'var(--ink-3)', marginBottom: 16 }}>
            Choose which student this evaluation is for. Only active student accounts are shown.
          </div>
          <div style={{ position: 'relative', marginBottom: 12 }}>
            <Icon name="search" size={13} style={{ position: 'absolute', left: 10, top: '50%', transform: 'translateY(-50%)', color: 'var(--ink-4)' }}/>
            <input className="input" placeholder="Search by name or reg number…"
              value={studentSearch} onChange={(e) => setStudentSearch(e.target.value)}
              style={{ width: '100%', padding: '9px 10px 9px 32px', fontSize: 13 }}/>
          </div>
          {loadingStudents ? (
            <div style={{ padding: 24, textAlign: 'center', color: 'var(--ink-4)' }}>Loading students…</div>
          ) : (
            <div style={{ maxHeight: 320, overflowY: 'auto', border: '1px solid var(--rule)', borderRadius: 6 }}>
              {studentList.filter(s =>
                !studentSearch ||
                s.name.toLowerCase().includes(studentSearch.toLowerCase()) ||
                (s.reg_number || '').toLowerCase().includes(studentSearch.toLowerCase())
              ).map((s) => (
                <div key={s.id} onClick={() => setSelectedStudent(s)}
                  style={{
                    display: 'flex', alignItems: 'center', gap: 12, padding: '10px 14px',
                    borderBottom: '1px solid var(--rule)', cursor: 'pointer',
                    background: selectedStudent?.id === s.id ? 'color-mix(in oklab, var(--accent) 8%, transparent)' : 'transparent',
                    transition: 'background .1s',
                  }}>
                  <Avatar name={s.name} size={32} seed={s.id}/>
                  <div style={{ flex: 1 }}>
                    <div style={{ fontSize: 13, fontWeight: 500 }}>{s.name}</div>
                    <div className="mono" style={{ fontSize: 11, color: 'var(--ink-4)' }}>{s.reg_number || '—'} · {s.department || '—'}</div>
                  </div>
                  {selectedStudent?.id === s.id && <Icon name="check" size={14} style={{ color: 'var(--accent)' }}/>}
                </div>
              ))}
              {studentList.length === 0 && (
                <div style={{ padding: 24, textAlign: 'center', color: 'var(--ink-4)' }}>
                  No student accounts found. Create students via User Management first.
                </div>
              )}
            </div>
          )}
          <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: 16 }}>
            <button className="btn btn-primary" disabled={!selectedStudent} onClick={() => setStep(0)}>
              Continue with {selectedStudent?.name || 'student'} <Icon name="arrowRight" size={12}/>
            </button>
          </div>
        </div>
      )}

      {step === 0 && !isSuperAdmin && user?.role === 'user' && (
        <div className="card card-pad fade-in mb-3" style={{ background: 'color-mix(in oklab, var(--accent) 5%, var(--card))', border: '1px solid color-mix(in oklab, var(--accent) 20%, var(--rule))' }}>
          <div className="eyebrow mb-2" style={{ color: 'var(--accent)' }}>Your identity — locked to your account</div>
          <div style={{ display: 'flex', gap: 20, flexWrap: 'wrap', fontSize: 12.5, color: 'var(--ink-2)' }}>
            <span><b>{user?.name}</b></span>
            <span className="mono" style={{ color: 'var(--ink-3)' }}>{user?.reg_number || user?.regNo || '—'}</span>
            <span style={{ color: 'var(--ink-3)' }}>{user?.department || user?.dept || '—'}</span>
            {(user?.college) && <span style={{ color: 'var(--ink-3)' }}>{user.college}</span>}
          </div>
          <div style={{ fontSize: 10.5, color: 'var(--ink-4)', marginTop: 6 }}>
            <Icon name="lock" size={10}/> Your name and register number are taken from your account and cannot be changed here.
          </div>
        </div>
      )}
      {step === 0 && (
        <div className="card card-pad fade-in">
          <div className="eyebrow mb-3">Step 1 · Your topic</div>
          <div className="field mb-3">
            <label>Topic title</label>
            <input className="input" value={topic} onChange={(e) => setTopic(e.target.value)}/>
          </div>
          <div className="field mb-4">
            <label>Supporting material (optional)</label>
            <div style={{ border: '1.5px dashed var(--rule-2)', borderRadius: 6, padding: 24, textAlign: 'center', background: 'var(--paper-2)' }}>
              <Icon name="upload" size={20} style={{ color: 'var(--ink-4)', marginBottom: 8 }}/>
              <div style={{ fontSize: 12.5, color: 'var(--ink-3)' }}>Drop a PDF or click to upload</div>
              <div style={{ fontSize: 10.5, color: 'var(--ink-4)', marginTop: 4 }} className="mono">PDF · DOCX · Max 5 MB</div>
            </div>
          </div>
          <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
            <button className="btn btn-primary" onClick={() => setStep(1)}>Continue <Icon name="arrowRight" size={12}/></button>
          </div>
        </div>
      )}

      {step === 1 && (
        <div className="card card-pad fade-in">
          <div className="eyebrow mb-3">Step 2 · Self-assessment</div>
          <div className="serif" style={{ fontSize: 16, lineHeight: 1.5, marginBottom: 18, color: 'var(--ink-2)', fontStyle: 'italic' }}>
            “Before you present, rate your own expectations. We'll compare these to the AI's scores after.”
          </div>
          {[
            { k: 'q1', label: 'How prepared do you feel about the content?' },
            { k: 'q2', label: 'How confident are you about your delivery?' },
            { k: 'q3', label: 'How clear is your structure in your own head?' },
          ].map((q) => (
            <div key={q.k} style={{ marginBottom: 16 }}>
              <div style={{ fontSize: 12.5, color: 'var(--ink-2)', marginBottom: 8 }}>{q.label}</div>
              <div style={{ display: 'flex', gap: 4 }}>
                {Array.from({ length: 10 }, (_, i) => (
                  <button key={i} onClick={() => setSelf((s) => ({ ...s, [q.k]: i + 1 }))}
                    className="mono tnum"
                    style={{
                      width: 34, height: 34, borderRadius: 4,
                      border: '1px solid ' + (self[q.k] === i + 1 ? 'var(--accent)' : 'var(--rule-2)'),
                      background: self[q.k] === i + 1 ? 'var(--accent)' : 'var(--card)',
                      color: self[q.k] === i + 1 ? '#fff' : 'var(--ink-3)',
                      fontSize: 12, cursor: 'pointer', transition: 'all .12s',
                    }}>{i + 1}</button>
                ))}
              </div>
            </div>
          ))}
          <div style={{ display: 'flex', justifyContent: 'space-between' }}>
            <button className="btn" onClick={() => setStep(0)}><Icon name="arrowLeft" size={12}/> Back</button>
            <button className="btn btn-primary" onClick={() => setStep(2)}>Continue <Icon name="arrowRight" size={12}/></button>
          </div>
        </div>
      )}

      {step === 2 && (
        <div className="card fade-in">
          <div className="card-hd">
            <span className="card-title">Step {isSuperAdmin ? 4 : 3} · {isSuperAdmin ? 'Upload or record audio' : 'Record your presentation'}</span>
            <span className="card-desc">on: <em>{topic}</em></span>
            <span style={{ marginLeft: 'auto' }} className="pill">{recUI === 'radial' ? 'Radial' : recUI === 'wave' ? 'Waveform' : 'Minimal'}</span>
          </div>

          {/* Superadmin: audio file upload option */}
          {isSuperAdmin && (
            <div style={{ padding: '12px 20px', borderBottom: '1px solid var(--rule)', background: 'var(--paper-2)' }}>
              <div className="eyebrow mb-2" style={{ fontSize: 9 }}>Upload audio file</div>
              <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
                <input ref={uploadRef} type="file" accept="audio/*,.webm,.mp3,.wav,.m4a,.ogg"
                  style={{ display: 'none' }}
                  onChange={(e) => {
                    const f = e.target.files?.[0];
                    if (f) { setUploadedFile(f); chunksRef.current = []; }
                  }}/>
                <button className="btn btn-sm" onClick={() => uploadRef.current?.click()}>
                  <Icon name="upload" size={11}/> Choose audio file
                </button>
                {uploadedFile && (
                  <span style={{ fontSize: 12, color: 'var(--ok)' }}>
                    <Icon name="check" size={12}/> {uploadedFile.name} ({(uploadedFile.size / 1024).toFixed(0)} KB)
                    <button style={{ marginLeft: 8, background: 'none', border: 'none', cursor: 'pointer', color: 'var(--bad)', fontSize: 11 }}
                      onClick={() => { setUploadedFile(null); if (uploadRef.current) uploadRef.current.value = ''; }}>
                      Remove
                    </button>
                  </span>
                )}
              </div>
              {uploadedFile && (
                <div style={{ marginTop: 10, display: 'flex', justifyContent: 'flex-end' }}>
                  <button className="btn btn-primary" onClick={() => { setStep(3); submitEvaluation(); }}>
                    <Icon name="sparkle" size={12}/> Analyse uploaded audio
                  </button>
                </div>
              )}
              <div style={{ marginTop: 8, fontSize: 10.5, color: 'var(--ink-4)' }}>
                Or record live below ↓ (WAV, MP3, WebM, M4A accepted · max 50 MB)
              </div>
            </div>
          )}

          <RecorderPanel
            variant={recUI}
            recording={recording}
            seconds={seconds}
            onToggle={handleToggle}
            onStop={handleStop}
          />
        </div>
      )}

      {step === 'review' && (
        <div className="card card-pad fade-in" style={{ padding: '40px 32px', textAlign: 'center' }}>
          <div style={{ width: 56, height: 56, borderRadius: '50%', background: 'color-mix(in oklab, var(--ok) 14%, transparent)', display: 'grid', placeItems: 'center', margin: '0 auto 16px', color: 'var(--ok)' }}>
            <Icon name="check" size={28}/>
          </div>
          <div className="serif" style={{ fontSize: 22, marginBottom: 8 }}>Recording complete</div>
          <div style={{ color: 'var(--ink-4)', fontSize: 13, marginBottom: 6 }}>
            {Math.floor(seconds / 60)}:{String(seconds % 60).padStart(2, '0')} of audio captured for topic: <em>{topic}</em>
          </div>
          <div style={{ fontSize: 12, color: 'var(--ink-4)', marginBottom: 28 }}>
            Review your recording details above before submitting for AI analysis.
          </div>
          <div style={{ display: 'flex', gap: 10, justifyContent: 'center', flexWrap: 'wrap' }}>
            <button className="btn" onClick={() => {
              chunksRef.current = [];
              setSeconds(0);
              setStep(2);
            }}>
              <Icon name="refresh" size={12}/> Re-record
            </button>
            <button className="btn btn-primary" style={{ minWidth: 180 }} onClick={() => {
              setStep(3);
              submitEvaluation();
            }}>
              <Icon name="sparkle" size={12}/> Analyse recording
            </button>
          </div>
        </div>
      )}

      {step === 3 && (
        <div className="card card-pad fade-in" style={{ padding: '48px 32px', textAlign: 'center' }}>
          {!procErr && <div style={{ width: 48, height: 48, margin: '0 auto 16px', border: '3px solid var(--rule)', borderTopColor: 'var(--accent)', borderRadius: '50%', animation: 'rotate 1s linear infinite' }}/>}
          {procErr && <div style={{ width: 48, height: 48, margin: '0 auto 16px', display: 'grid', placeItems: 'center', color: 'var(--bad)' }}><Icon name="alert" size={36}/></div>}
          <div className="serif" style={{ fontSize: 22, marginBottom: 8 }}>{procErr ? 'Evaluation failed' : 'Your report is being prepared'}</div>
          <div style={{ color: 'var(--ink-4)', fontSize: 13, marginBottom: 20 }}>
            {procErr ? procErr : 'This usually takes 20–40 seconds. We\'ll retry if the server is slow.'}
          </div>
          {!procErr && (
            <div style={{ maxWidth: 360, margin: '0 auto' }}>
              {['Transcribing audio', 'Analysing delivery', 'Scoring criteria', 'Composing verdict'].map((s, i) => (
                <div key={i} style={{
                  display: 'flex', alignItems: 'center', gap: 10, padding: '8px 12px',
                  fontSize: 12, color: i < procStep ? 'var(--ink)' : i === procStep ? 'var(--accent)' : 'var(--ink-4)',
                  borderBottom: i < 3 ? '1px solid var(--rule)' : 'none',
                }}>
                  <span style={{
                    width: 16, height: 16, borderRadius: '50%',
                    border: `1.5px solid ${i < procStep ? 'var(--ok)' : 'var(--rule-2)'}`,
                    background: i < procStep ? 'var(--ok)' : 'transparent',
                    color: '#fff', fontSize: 9, display: 'grid', placeItems: 'center',
                  }}>{i < procStep ? '✓' : ''}</span>
                  <span style={{ flex: 1, textAlign: 'left' }}>{s}</span>
                  {i === procStep && <span className="mono" style={{ fontSize: 10, color: 'var(--accent)' }}>running…</span>}
                </div>
              ))}
            </div>
          )}
          {procErr && (
            <div style={{ display: 'flex', gap: 10, justifyContent: 'center', marginTop: 16 }}>
              <button className="btn" onClick={() => setView('student_take')}>Back to slots</button>
              <button className="btn btn-primary" onClick={() => { setProcErr(''); submitEvaluation(0); }}>Retry</button>
            </div>
          )}
        </div>
      )}
    </div>
  );
}

function MyReportsView({ reports, openReport }) {
  return (
    <div className="fade-up">
      <div className="page-head">
        <div>
          <div className="eyebrow mb-2">Portfolio</div>
          <h1 className="page-title">My <em>reports</em></h1>
          <div className="page-sub">{reports.length} evaluations · track your progress over time.</div>
        </div>
      </div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: 12 }} className="stagger">
        {[...reports].reverse().map((r) => (
          <div key={r.id} className="card card-pad" style={{ cursor: 'pointer' }} onClick={() => openReport(r)}>
            <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', marginBottom: 10 }}>
              <div className="serif" style={{ fontSize: 16, lineHeight: 1.3, paddingRight: 8 }}>{r.topic}</div>
              <ScoreRing value={r.scores.overall} size={56} stroke={4} label="" animate={false}/>
            </div>
            <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 10 }}>
              <span className={`pill pill-${r.grade.tone}`}>{r.grade.g}</span>
              <span className="mono" style={{ fontSize: 10.5, color: 'var(--ink-4)' }}>{fmtDate(r.date)}</span>
            </div>
            <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10.5, color: 'var(--ink-4)' }} className="mono">
              <span>{r.duration}s</span><span>{r.words}w</span><span>{r.wpm} wpm</span><span>{r.fillers} fillers</span>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

// ── AUTH SCREEN ─────────────────────────────────────────
function AuthScreen({ onAuth }) {
  const [tab, setTab] = React.useState('login');
  const [email, setEmail] = React.useState('');
  const [password, setPassword] = React.useState('');
  const [regName, setRegName] = React.useState('');
  const [regEmail, setRegEmail] = React.useState('');
  const [regPassword, setRegPassword] = React.useState('');
  const [regNo, setRegNo] = React.useState('');
  const [dept, setDept] = React.useState('');
  const [regCollege, setRegCollege] = React.useState('');
  const [loading, setLoading] = React.useState(false);
  const [waking, setWaking] = React.useState(false);
  const [err, setErr] = React.useState('');

  // Load colleges for registration dropdowns
  const [collegeList, setCollegeList] = React.useState([]);
  React.useEffect(() => {
    fetch(`${API_BASE}/colleges/`)
      .then((r) => r.ok ? r.json() : [])
      .then((data) => setCollegeList(Array.isArray(data) ? data : []))
      .catch(() => setCollegeList([]));
  }, []);
  const deptOptions = React.useMemo(() => {
    if (!regCollege) return [];
    const c = collegeList.find((c) => c.name === regCollege);
    return c ? c.departments.map((d) => d.name) : [];
  }, [regCollege, collegeList]);

  const handleLogin = async (e) => {
    e?.preventDefault?.();
    setErr(''); setLoading(true);
    try {
      setWaking(true);
      try { await fetch(`${API_BASE}/health`, { signal: AbortSignal.timeout(30000) }); } catch {}
      setWaking(false);
      const body = new FormData();
      body.append('username', email.trim());
      body.append('password', password);
      const res = await fetch(`${API_BASE}/auth/login`, { method: 'POST', body });
      if (!res.ok) {
        let msg = 'Invalid credentials';
        try { const j = await res.json(); msg = j.detail || msg; } catch {}
        throw new Error(msg);
      }
      const data = await res.json();
      const user = _saveAuth(data);
      onAuth(user);
    } catch (ex) {
      setErr(ex.message || 'Login failed');
    } finally {
      setLoading(false); setWaking(false);
    }
  };

  const [regSuccess, setRegSuccess] = React.useState(false);

  const handleRegister = async (e) => {
    e?.preventDefault?.();
    setErr(''); setLoading(true);
    try {
      const data = await apiFetch('/auth/register', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ name: regName.trim(), email: regEmail.trim(), password: regPassword, reg_number: regNo, department: dept, college: regCollege }),
      });
      if (data.pending_approval) {
        setRegSuccess(true);
      } else {
        // Legacy: active immediately — switch to login
        setTab('login');
        setEmail(regEmail); setPassword('');
        setErr('');
      }
    } catch (ex) {
      setErr(ex.message || 'Registration failed');
    } finally {
      setLoading(false);
    }
  };

  return (
    <div style={{ minHeight: '100vh', display: 'grid', gridTemplateColumns: '1.1fr 1fr', background: 'var(--paper)' }}>
      <div className="auth-left-panel" style={{ padding: '64px 56px', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }}>
        <div>
          {/* ── Brand header with new logo ── */}
          <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 48 }}>
            <img src="data:image/png;base64,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" alt="ChiselAssess"
              style={{ width: 52, height: 'auto', objectFit: 'contain' }} />
            <div>
              <div style={{ fontWeight: 800, fontSize: 20, letterSpacing: '-0.01em', color: 'var(--ink)' }}>
                ChiselAssess
              </div>
              <div style={{ fontSize: 10.5, color: 'var(--ink-4)', marginTop: 2, letterSpacing: '0.06em', textTransform: 'uppercase', fontFamily: 'var(--f-mono)' }}>
                Learning Solutions @Chisel
              </div>
            </div>
          </div>

          <h1 className="serif" style={{ fontSize: 44, lineHeight: 1.02, letterSpacing: '-0.015em', marginBottom: 16 }}>
            The voice<br/>of <em style={{ color: 'var(--accent)' }}>every</em><br/>student.
          </h1>
          <div style={{ fontSize: 14, lineHeight: 1.65, color: 'var(--ink-3)', maxWidth: '40ch' }}>
            AI-powered oral-presentation evaluation — detailed rubrics, voice telemetry, and a trend line for every learner.
          </div>
        </div>

        <div style={{ fontSize: 10.5, color: 'var(--ink-4)', fontFamily: 'var(--f-mono)', letterSpacing: '0.03em' }}>
          © {new Date().getFullYear()} <strong>Learning Solutions @Chisel</strong> · www.ls-chisel.com
        </div>
      </div>

      <div style={{ padding: '64px 56px', display: 'flex', alignItems: 'center' }}>
        <div style={{ width: '100%', maxWidth: 380 }}>
          {/* Tabs */}
          <div style={{ display: 'flex', borderBottom: '1px solid var(--rule)', marginBottom: 28, gap: 0 }}>
            {['login', 'register'].map((t) => (
              <button key={t} onClick={() => { setTab(t); setErr(''); }}
                className="btn btn-ghost"
                style={{
                  borderRadius: 0, padding: '8px 16px', fontSize: 12.5, textTransform: 'capitalize',
                  borderBottom: tab === t ? '2px solid var(--accent)' : '2px solid transparent',
                  color: tab === t ? 'var(--ink)' : 'var(--ink-4)', fontWeight: tab === t ? 600 : 400,
                }}>
                {t === 'login' ? 'Sign in' : 'Register'}
              </button>
            ))}
          </div>

          {tab === 'login' && (
            <>
              <h2 className="serif" style={{ fontSize: 32, letterSpacing: '-0.01em', marginBottom: 22 }}>Welcome back.</h2>
              <form className="col" onSubmit={handleLogin}>
                <div className="field">
                  <label>Email</label>
                  <input className="input" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="you@college.ac.in" type="email" required autoFocus/>
                </div>
                <div className="field">
                  <label>Password</label>
                  <input className="input" type="password" value={password} onChange={(e) => setPassword(e.target.value)} required/>
                </div>
                {err && <div style={{ fontSize: 12, color: 'var(--bad)', padding: '8px 12px', background: 'color-mix(in oklab, var(--bad) 8%, transparent)', borderRadius: 6 }}>{err}</div>}
                <button type="submit" className="btn btn-primary btn-lg" disabled={loading} style={{ justifyContent: 'center', marginTop: 8 }}>
                  {waking ? 'Waking server…' : loading ? 'Signing in…' : <><span>Sign in</span><Icon name="arrowRight" size={13}/></>}
                </button>
              </form>
              <div style={{ marginTop: 20, fontSize: 11.5, color: 'var(--ink-4)' }}>
                Protected by college SSO · <span style={{ color: 'var(--accent)', cursor: 'pointer' }} onClick={() => setTab('register')}>Create account</span>
              </div>
            </>
          )}

          {tab === 'register' && (
            <>
              <h2 className="serif" style={{ fontSize: 32, letterSpacing: '-0.01em', marginBottom: 22 }}>Create account.</h2>

              {regSuccess ? (
                <div style={{ textAlign: 'center', padding: '28px 16px' }}>
                  <div style={{ width: 56, height: 56, borderRadius: '50%', background: 'var(--ok-wash)', border: '2px solid var(--ok)', display: 'grid', placeItems: 'center', margin: '0 auto 16px' }}>
                    <Icon name="check" size={22} style={{ color: 'var(--ok)' }}/>
                  </div>
                  <div className="serif" style={{ fontSize: 22, marginBottom: 8 }}>Registration submitted!</div>
                  <div style={{ fontSize: 13, color: 'var(--ink-3)', lineHeight: 1.6, marginBottom: 20 }}>
                    Your account is <b>pending admin approval</b>.<br/>
                    A superadmin must activate your account before you can sign in.<br/>
                    Contact your faculty or institution admin to expedite access.
                  </div>
                  <button className="btn btn-sm" onClick={() => { setTab('login'); setRegSuccess(false); }}>
                    Back to sign in
                  </button>
                </div>
              ) : (
                <form className="col" onSubmit={handleRegister}>
                  <div className="field">
                    <label>Full name</label>
                    <input className="input" value={regName} onChange={(e) => setRegName(e.target.value)} placeholder="Your full name" required/>
                  </div>
                  <div className="field">
                    <label>Email</label>
                    <input className="input" type="email" value={regEmail} onChange={(e) => setRegEmail(e.target.value)} placeholder="you@college.ac.in" required/>
                  </div>
                  <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10 }}>
                    <div className="field">
                      <label>Reg. number</label>
                      <input className="input mono" value={regNo} onChange={(e) => setRegNo(e.target.value.toUpperCase())} placeholder="Register number"/>
                    </div>
                    <div className="field">
                      <label>College</label>
                      {collegeList.length > 0
                        ? <select className="input" value={regCollege} onChange={(e) => { setRegCollege(e.target.value); setDept(''); }}>
                            <option value="">— select college —</option>
                            {collegeList.map((c) => <option key={c.id} value={c.name}>{c.name}</option>)}
                          </select>
                        : <input className="input" value={regCollege} onChange={(e) => setRegCollege(e.target.value)} placeholder="College name"/>
                      }
                    </div>
                  </div>
                  <div className="field">
                    <label>Department / Branch</label>
                    {deptOptions.length > 0
                      ? <select className="input" value={dept} onChange={(e) => setDept(e.target.value)}>
                          <option value="">— select department —</option>
                          {deptOptions.map((d) => <option key={d} value={d}>{d}</option>)}
                        </select>
                      : <input className="input" value={dept} onChange={(e) => setDept(e.target.value)} placeholder="e.g. CSE, ECE, IT"/>
                    }
                  </div>
                  <div className="field">
                    <label>Password</label>
                    <input className="input" type="password" value={regPassword} onChange={(e) => setRegPassword(e.target.value)} required minLength={6}/>
                  </div>
                  {err && <div style={{ fontSize: 12, color: 'var(--bad)', padding: '8px 12px', background: 'color-mix(in oklab, var(--bad) 8%, transparent)', borderRadius: 6 }}>{err}</div>}
                  <button type="submit" className="btn btn-primary btn-lg" disabled={loading} style={{ justifyContent: 'center', marginTop: 8 }}>
                    {loading ? 'Creating account…' : <><span>Register</span><Icon name="arrowRight" size={13}/></>}
                  </button>
                </form>
              )}
            </>
          )}
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { StudentHome, StudentTakeAssessment, EvaluationFlow, MyReportsView, AuthScreen });
