// M9 — Obuka (Vigilo Mobile)
// Integrisan trening modul. Zamenjuje LearnDash.
// Tri view-a: ListView (moduli), LessonView (video + tekst), QuizView (pitanja).

const V9 = {
  paper:   'oklch(0.985 0.003 60)',
  ink75:   'oklch(0.972 0.004 60)',
  ink100:  'oklch(0.955 0.005 60)',
  ink150:  'oklch(0.930 0.006 60)',
  ink200:  'oklch(0.900 0.007 60)',
  ink300:  'oklch(0.830 0.008 60)',
  ink400:  'oklch(0.700 0.010 60)',
  ink500:  'oklch(0.580 0.011 60)',
  ink600:  'oklch(0.460 0.012 60)',
  ink700:  'oklch(0.340 0.013 60)',
  ink800:  'oklch(0.240 0.014 60)',
  ink900:  'oklch(0.160 0.015 60)',
  ink950:  'oklch(0.110 0.015 60)',
  red500:  'oklch(0.590 0.215 25)',
  success: 'oklch(0.620 0.155 152)',
  successBg:'oklch(0.960 0.030 152)',
  warning: 'oklch(0.745 0.150 70)',
  warningBg:'oklch(0.970 0.035 80)',
  info:    'oklch(0.580 0.155 245)',
  infoBg:  'oklch(0.965 0.025 245)',
  danger:  'oklch(0.590 0.215 25)',
  dangerBg:'oklch(0.960 0.025 25)',
  font:    'Geist, -apple-system, system-ui, sans-serif',
  mono:    '"Geist Mono", ui-monospace, SF Mono, Menlo, monospace',
};

const I9 = ({ children, size = 18, sw = 1.6, fill = 'none' }) => (
  <svg width={size} height={size} viewBox="0 0 24 24" fill={fill} stroke="currentColor" strokeWidth={sw} strokeLinecap="round" strokeLinejoin="round" style={{ flexShrink: 0 }}>{children}</svg>
);
const Back9   = (p) => <I9 {...p}><path d="m15 18-6-6 6-6"/></I9>;
const Chk9    = (p) => <I9 {...p}><path d="M20 6 9 17l-5-5"/></I9>;
const Play    = (p) => <I9 {...p}><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></I9>;
const Pause9  = (p) => <I9 {...p}><rect x="6" y="4" width="4" height="16" fill="currentColor" stroke="none"/><rect x="14" y="4" width="4" height="16" fill="currentColor" stroke="none"/></I9>;
const Lock9   = (p) => <I9 {...p}><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></I9>;
const Arrow9  = (p) => <I9 {...p}><path d="M5 12h14M12 5l7 7-7 7"/></I9>;
const Book9   = (p) => <I9 {...p}><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></I9>;
const Cup     = (p) => <I9 {...p}><path d="M6 9H4a2 2 0 0 0-2 2v0a2 2 0 0 0 2 2h2M18 9h2a2 2 0 0 1 2 2v0a2 2 0 0 1-2 2h-2M6 3h12v8a6 6 0 0 1-12 0z"/><path d="M9 17h6M10 21h4M12 17v4"/></I9>;
const Star9   = (p) => <I9 {...p}><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" fill="currentColor" stroke="none"/></I9>;
const Vol     = (p) => <I9 {...p}><path d="M11 5 6 9H2v6h4l5 4zM19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"/></I9>;
const Expand  = (p) => <I9 {...p}><path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/></I9>;
const X9      = (p) => <I9 {...p}><path d="M18 6 6 18M6 6l12 12"/></I9>;
const Clk9    = (p) => <I9 {...p}><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></I9>;

const Tap9 = ({ children, onClick, disabled, style }) => (
  <button onClick={disabled ? null : onClick} disabled={disabled} style={{
    background: 'transparent', border: 0, padding: 0, cursor: disabled ? 'default' : 'pointer',
    font: 'inherit', color: 'inherit', WebkitTapHighlightColor: 'transparent', ...style,
  }}>{children}</button>
);

// ─────────────────────────────────────────────────────────────
// Sample modules — bazirano na trenutnoj CRTA obuci
// ─────────────────────────────────────────────────────────────
const MODULES = [
  { id: 1, t: 'Uloga i zadaci posmatrača', s: '12 min · 2 lekcije + kviz', state: 'done',     score: 5 },
  { id: 2, t: 'Pravila ponašanja i kodeks', s: '8 min · 1 lekcija + kviz',  state: 'done',     score: 5 },
  { id: 3, t: 'Otvaranje BM i početak glasanja', s: '14 min · 2 lekcije + kviz', state: 'done', score: 4 },
  { id: 4, t: 'Glasanje na biračkom mestu', s: '18 min · 3 lekcije + kviz', state: 'active',   progress: 0.55 },
  { id: 5, t: 'Posmatranje izbora ispred BM', s: '10 min · 1 lekcija + kviz', state: 'next' },
  { id: 6, t: 'Zatvaranje BM i utvrđivanje rezultata', s: '22 min · 3 lekcije + kviz', state: 'locked' },
  { id: 7, t: 'Izveštavanje i prijava incidenata', s: '15 min · 2 lekcije + kviz', state: 'locked' },
  { id: 8, t: 'Završni test',                  s: '~20 min · 25 pitanja',     state: 'locked', isFinal: true },
];

const QUIZ_QS = [
  {
    q: 'Šta posmatrač treba da uradi kada vidi da neko deli letake ispred biračkog mesta?',
    opts: [
      'Odmah priđe, traži ime i prezime osobe',
      'Zabeleži šta vidi i prijavi kroz aplikaciju kao incident',
      'Pozove policiju samostalno',
      'Zatraži od BO da ih udalji',
    ],
    correct: 1,
    explanation: 'Tvoja uloga je da posmatraš i prijaviš. Sistem klasifikuje i bira ko intervenira — ne ti.',
  },
  {
    q: 'Kada je dozvoljeno fotografisati zapisnik o radu BO?',
    opts: [
      'U bilo kom trenutku tokom dana',
      'Tek nakon što ga BO javno istakne (po zatvaranju)',
      'Samo uz dozvolu predsednika BO',
      'Nikada — to je strogo zabranjeno',
    ],
    correct: 1,
    explanation: 'Po Zakonu o izboru čl. 78, zapisnik je javan tek nakon isticanja. Pre toga, fotografisanje je incident.',
  },
  {
    q: 'Šta uraditi ako ti se broj birača koji su izašli ne slaže sa brojem izvučenih listića za 3?',
    opts: [
      'Ne šalji izveštaj — sistem će odbiti',
      'Pošalji izveštaj sa razlikom — sistem će označiti upozorenjem',
      'Pozovi koordinatora pre slanja',
      'Probaj da nateraš BO da prebroji ponovo',
    ],
    correct: 1,
    explanation: 'Vigilo nikad ne blokira slanje. Soft warning ide ka analitičaru, koji odlučuje šta dalje. Princip: „ne možemo da znamo" — možda je razlika realna.',
  },
];

// ═════════════════════════════════════════════════════════════
// VIEW 1 — Lista modula
// ═════════════════════════════════════════════════════════════
function ListView({ onOpenModule, onOpenQuiz }) {
  const doneCount = MODULES.filter(m => m.state === 'done').length;
  const total = MODULES.length;
  const overallPct = doneCount / total;
  const activeMod = MODULES.find(m => m.state === 'active');

  return (
    <div style={{ background: V9.paper, height: '100%', display: 'flex', flexDirection: 'column', fontFamily: V9.font, color: V9.ink900 }}>
      <div style={{ paddingTop: 56 }} />

      <div style={{ padding: '6px 20px 12px' }}>
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 4 }}>
          <div style={{ fontSize: 28, fontWeight: 600, letterSpacing: -0.6 }}>Obuka</div>
          <Tap9 style={{ padding: '6px 10px', fontSize: 12, color: V9.ink600, fontFamily: V9.mono, background: V9.ink100, borderRadius: 6 }}>
            <Clk9 size={12}/> 1h 39m ukupno
          </Tap9>
        </div>
        <div style={{ fontSize: 13.5, color: V9.ink500, lineHeight: 1.5 }}>
          Obavezna obuka pre izbornog dana. Možeš pauzirati i nastaviti gde si stao.
        </div>
      </div>

      {/* Progress hero card */}
      <div style={{ margin: '0 16px 16px', padding: 18, background: V9.ink950, color: 'white', borderRadius: 16,
        backgroundImage: 'radial-gradient(circle at 100% 0%, oklch(0.59 0.215 25 / 0.22), transparent 55%)',
      }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 14 }}>
          <div>
            <div style={{ fontSize: 10.5, fontFamily: V9.mono, textTransform: 'uppercase', letterSpacing: 0.08, opacity: 0.55, marginBottom: 4 }}>Tvoj napredak</div>
            <div style={{ fontSize: 16, fontWeight: 600 }}>{doneCount} od {total} modula</div>
          </div>
          <div style={{ fontSize: 32, fontWeight: 600, letterSpacing: -0.8, fontFamily: V9.mono, fontVariantNumeric: 'tabular-nums', color: 'oklch(0.85 0.15 60)' }}>{Math.round(overallPct * 100)}%</div>
        </div>
        <div style={{ height: 8, background: 'oklch(1 0 0 / 0.08)', borderRadius: 4, overflow: 'hidden', marginBottom: 14 }}>
          <div style={{ width: `${overallPct * 100}%`, height: '100%', background: V9.success, borderRadius: 4 }}/>
        </div>
        {activeMod && (
          <Tap9 onClick={() => onOpenModule(activeMod.id)} style={{
            width: '100%', padding: '12px 14px', background: 'oklch(1 0 0 / 0.08)',
            border: '1px solid oklch(1 0 0 / 0.1)', borderRadius: 12,
            display: 'flex', alignItems: 'center', gap: 12, textAlign: 'left',
          }}>
            <div style={{
              width: 36, height: 36, borderRadius: 10,
              background: V9.warning, color: V9.ink950,
              display: 'grid', placeItems: 'center',
            }}><Play size={16}/></div>
            <div style={{ flex: 1 }}>
              <div style={{ fontSize: 10.5, fontFamily: V9.mono, textTransform: 'uppercase', letterSpacing: 0.06, opacity: 0.6 }}>Nastavi · modul {activeMod.id}</div>
              <div style={{ fontSize: 13.5, fontWeight: 500, marginTop: 2 }}>{activeMod.t}</div>
              <div style={{ fontSize: 11, opacity: 0.55, fontFamily: V9.mono, marginTop: 2 }}>{Math.round((activeMod.progress || 0) * 100)}% · ~8 min preostalo</div>
            </div>
            <Arrow9 size={18} sw={2}/>
          </Tap9>
        )}
      </div>

      {/* Module list */}
      <div style={{ flex: 1, overflowY: 'auto', padding: '0 16px 36px' }}>
        <div style={{ fontSize: 11, fontFamily: V9.mono, color: V9.ink400, textTransform: 'uppercase', letterSpacing: 0.08, marginBottom: 10 }}>Svi moduli</div>
        <div style={{ background: 'white', border: '1px solid ' + V9.ink200, borderRadius: 14 }}>
          {MODULES.map((m, i, arr) => {
            const isLocked = m.state === 'locked';
            const isDone = m.state === 'done';
            const isActive = m.state === 'active';
            const isFinal = m.isFinal;
            return (
              <Tap9
                key={m.id}
                onClick={() => isLocked ? null : (isFinal ? onOpenQuiz('final') : onOpenModule(m.id))}
                disabled={isLocked}
                style={{
                  display: 'flex', alignItems: 'center', gap: 14,
                  padding: '14px 16px', width: '100%', textAlign: 'left',
                  borderBottom: i === arr.length - 1 ? 'none' : '1px solid ' + V9.ink150,
                  opacity: isLocked ? 0.55 : 1,
                  background: isActive ? V9.warningBg : 'transparent',
                }}>
                <div style={{
                  width: 36, height: 36, borderRadius: 10, flexShrink: 0,
                  background: isDone   ? V9.successBg
                           : isActive ? V9.warning
                           : isFinal  ? V9.ink950
                           : V9.ink100,
                  color: isDone ? V9.success : isActive ? V9.ink950 : isFinal ? 'white' : V9.ink500,
                  display: 'grid', placeItems: 'center', position: 'relative',
                }}>
                  {isDone   && <Chk9 size={18} sw={2.6}/>}
                  {isActive && <Play size={14}/>}
                  {isFinal && !isLocked && <Cup size={17}/>}
                  {isLocked && <Lock9 size={15}/>}
                  {!isDone && !isActive && !isFinal && !isLocked && <span style={{ fontFamily: V9.mono, fontWeight: 600, fontSize: 14 }}>{m.id}</span>}
                </div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 13.5, fontWeight: 500, color: V9.ink900, marginBottom: 2 }}>{m.t}</div>
                  <div style={{ fontSize: 11.5, color: V9.ink500, fontFamily: V9.mono }}>
                    {isLocked ? 'Otključava se posle prethodnog modula' : m.s}
                  </div>
                  {isActive && m.progress != null && (
                    <div style={{ marginTop: 6, height: 3, background: V9.ink150, borderRadius: 2 }}>
                      <div style={{ width: `${m.progress * 100}%`, height: '100%', background: V9.warning, borderRadius: 2 }}/>
                    </div>
                  )}
                </div>
                {isDone && m.score != null && (
                  <div style={{ display: 'flex', alignItems: 'center', gap: 2, color: V9.warning }}>
                    {Array.from({ length: 5 }).map((_, i) => (
                      <Star9 key={i} size={10} fill="currentColor" style={{ opacity: i < m.score ? 1 : 0.2 }}/>
                    ))}
                  </div>
                )}
              </Tap9>
            );
          })}
        </div>

        {/* Certificate preview if done */}
        <div style={{ marginTop: 16, padding: '14px 16px', background: V9.infoBg, border: '1px solid oklch(0.88 0.07 245)', borderRadius: 12, display: 'flex', alignItems: 'flex-start', gap: 10 }}>
          <Cup size={16} style={{ color: V9.info, marginTop: 2, flexShrink: 0 }}/>
          <div style={{ fontSize: 12, color: 'oklch(0.32 0.155 245)', lineHeight: 1.5 }}>
            Po završetku završnog testa, dobićeš CRTA sertifikat. Šaljemo ga na email + automatski povezujemo sa tvojim akreditacionim zahtevom.
          </div>
        </div>
      </div>
    </div>
  );
}

// ═════════════════════════════════════════════════════════════
// VIEW 2 — Lekcija (video + tekst)
// ═════════════════════════════════════════════════════════════
function LessonView({ moduleId, onBack, onStartQuiz }) {
  const mod = MODULES.find(m => m.id === moduleId) || MODULES[3];
  const [playing, setPlaying] = React.useState(false);
  const [progress, setProgress] = React.useState(0.32);

  React.useEffect(() => {
    if (!playing) return;
    const t = setTimeout(() => setProgress(p => Math.min(1, p + 0.005)), 100);
    return () => clearTimeout(t);
  }, [playing, progress]);

  return (
    <div style={{ background: V9.paper, height: '100%', display: 'flex', flexDirection: 'column', fontFamily: V9.font, color: V9.ink900 }}>
      <div style={{ paddingTop: 56 }} />

      <div style={{ display: 'flex', alignItems: 'center', padding: '8px 12px' }}>
        <Tap9 onClick={onBack} style={{ width: 40, height: 40, borderRadius: 10, display: 'grid', placeItems: 'center', color: V9.ink700 }}><Back9 size={20}/></Tap9>
        <div style={{ flex: 1, textAlign: 'center', minWidth: 0 }}>
          <div style={{ fontSize: 10.5, fontFamily: V9.mono, color: V9.ink500, textTransform: 'uppercase', letterSpacing: 0.06 }}>Modul {mod.id} · lekcija 2 od 3</div>
          <div style={{ fontSize: 14, fontWeight: 600, color: V9.ink900, marginTop: 2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{mod.t}</div>
        </div>
        <div style={{ width: 40 }}/>
      </div>

      <div style={{ flex: 1, overflowY: 'auto', padding: '8px 16px 16px' }}>
        {/* Video player */}
        <div style={{
          position: 'relative', aspectRatio: '16 / 9', background: V9.ink950, borderRadius: 12,
          overflow: 'hidden', marginBottom: 14,
          backgroundImage:
            'radial-gradient(circle at 35% 40%, oklch(0.4 0.04 245), transparent 50%),' +
            'radial-gradient(circle at 70% 60%, oklch(0.3 0.03 25), transparent 55%)',
        }}>
          {/* Fake video content — illustrative composition */}
          <div style={{ position: 'absolute', inset: 0, display: 'grid', placeItems: 'center', color: 'oklch(1 0 0 / 0.5)' }}>
            <div style={{ textAlign: 'center' }}>
              <div style={{ fontSize: 10.5, fontFamily: V9.mono, textTransform: 'uppercase', letterSpacing: 0.1, opacity: 0.7, marginBottom: 8 }}>VIDEO LEKCIJA · 6:42</div>
              <div style={{ fontSize: 14, fontWeight: 500, color: 'white' }}>Šta tačno smeš da slikaš?</div>
              <div style={{ fontSize: 11, color: 'oklch(1 0 0 / 0.55)', marginTop: 4 }}>vodi: Vukosava Crnjanski</div>
            </div>
          </div>

          {/* Play overlay button */}
          <Tap9 onClick={() => setPlaying(!playing)} style={{
            position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',
            width: 64, height: 64, borderRadius: '50%',
            background: 'oklch(1 0 0 / 0.95)', color: V9.ink950,
            display: 'grid', placeItems: 'center',
            boxShadow: '0 8px 32px oklch(0 0 0 / 0.4)',
          }}>{playing ? <Pause9 size={26}/> : <Play size={26} style={{ marginLeft: 2 }}/>}</Tap9>

          {/* Top controls */}
          <div style={{ position: 'absolute', top: 10, right: 10, display: 'flex', gap: 6 }}>
            <Tap9 style={{ width: 30, height: 30, borderRadius: '50%', background: 'oklch(0 0 0 / 0.4)', color: 'white', display: 'grid', placeItems: 'center' }}><Vol size={14}/></Tap9>
            <Tap9 style={{ width: 30, height: 30, borderRadius: '50%', background: 'oklch(0 0 0 / 0.4)', color: 'white', display: 'grid', placeItems: 'center' }}><Expand size={13}/></Tap9>
          </div>

          {/* Bottom progress */}
          <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, padding: 12 }}>
            <div style={{ height: 4, background: 'oklch(1 0 0 / 0.2)', borderRadius: 2, overflow: 'hidden', marginBottom: 6 }}>
              <div style={{ width: `${progress * 100}%`, height: '100%', background: 'white', borderRadius: 2 }}/>
            </div>
            <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10.5, fontFamily: V9.mono, color: 'oklch(1 0 0 / 0.85)' }}>
              <span>{Math.floor(progress * 6 + (progress * 60 * 0.7) / 60)}:{String(Math.floor(progress * 6 * 60 + progress * 42) % 60).padStart(2, '0')}</span>
              <span>6:42</span>
            </div>
          </div>
        </div>

        {/* Speed controls */}
        <div style={{ display: 'flex', gap: 6, marginBottom: 16 }}>
          {['0.75×', '1×', '1.25×', '1.5×'].map((s, i) => (
            <Tap9 key={s} style={{
              flex: 1, padding: '6px 0', textAlign: 'center', fontSize: 12, fontWeight: 500,
              background: i === 1 ? V9.ink950 : V9.ink100,
              color: i === 1 ? 'white' : V9.ink700,
              borderRadius: 8,
            }}>{s}</Tap9>
          ))}
        </div>

        {/* Lesson notes */}
        <div style={{ fontSize: 11, fontFamily: V9.mono, color: V9.ink400, textTransform: 'uppercase', letterSpacing: 0.08, marginBottom: 8 }}>Beleške uz lekciju</div>
        <div style={{ background: 'white', border: '1px solid ' + V9.ink200, borderRadius: 12, padding: 16 }}>
          <p style={{ margin: 0, fontSize: 14, color: V9.ink800, lineHeight: 1.6 }}>
            <strong style={{ fontWeight: 600 }}>Šta smeš da slikaš tokom dana:</strong>
          </p>
          <ul style={{ margin: '10px 0 14px', padding: '0 0 0 18px', fontSize: 13.5, color: V9.ink700, lineHeight: 1.6 }}>
            <li>Spoljašnji deo BM (zgrada, ulaz, plakat) — uvek</li>
            <li>Glasačko mesto izdaleka, bez kvaliteta detalja na listićima</li>
            <li>Akreditaciju člana BO, ako se to traži za prijavu</li>
          </ul>
          <p style={{ margin: 0, fontSize: 14, color: V9.ink800, lineHeight: 1.6 }}>
            <strong style={{ fontWeight: 600 }}>Šta NE smeš:</strong>
          </p>
          <ul style={{ margin: '10px 0 0', padding: '0 0 0 18px', fontSize: 13.5, color: V9.ink700, lineHeight: 1.6 }}>
            <li>Pojedinačni glasač i njegov listić — to je <strong style={{ color: V9.danger }}>krivično delo</strong></li>
            <li>Zapisnik pre nego što ga BO javno istakne (čl. 78)</li>
            <li>Lične podatke birača sa liste</li>
          </ul>
        </div>

        <div style={{ marginTop: 14, padding: '12px 14px', background: V9.infoBg, border: '1px solid oklch(0.88 0.07 245)', borderRadius: 10, fontSize: 12, color: 'oklch(0.32 0.155 245)', lineHeight: 1.5 }}>
          <strong style={{ fontWeight: 600 }}>Sledeći korak:</strong> kratak kviz od 3 pitanja. Možeš se vratiti na video bilo kad.
        </div>
      </div>

      <div style={{ padding: '12px 16px 36px', borderTop: '1px solid ' + V9.ink150 }}>
        <Tap9 onClick={onStartQuiz} style={{
          width: '100%', height: 52, background: V9.ink950, color: 'white',
          borderRadius: 14, fontFamily: V9.font, fontSize: 15, fontWeight: 600,
          display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
        }}>
          Pokreni kviz <Arrow9 size={17} sw={2.4}/>
        </Tap9>
      </div>
    </div>
  );
}

// ═════════════════════════════════════════════════════════════
// VIEW 3 — Kviz
// ═════════════════════════════════════════════════════════════
function QuizView({ onBack, onComplete }) {
  const [qi, setQi] = React.useState(0);
  const [picked, setPicked] = React.useState(null);
  const [answers, setAnswers] = React.useState([]);
  const q = QUIZ_QS[qi];
  const total = QUIZ_QS.length;
  const isLast = qi === total - 1;
  const showFeedback = picked != null;

  const next = () => {
    if (picked == null) return;
    setAnswers(a => [...a, picked]);
    if (isLast) onComplete([...answers, picked]);
    else { setQi(qi + 1); setPicked(null); }
  };

  return (
    <div style={{ background: V9.paper, height: '100%', display: 'flex', flexDirection: 'column', fontFamily: V9.font, color: V9.ink900 }}>
      <div style={{ paddingTop: 56 }} />
      <div style={{ display: 'flex', alignItems: 'center', padding: '8px 12px' }}>
        <Tap9 onClick={onBack} style={{ width: 40, height: 40, borderRadius: 10, display: 'grid', placeItems: 'center', color: V9.ink700 }}><X9 size={20}/></Tap9>
        <div style={{ flex: 1, padding: '0 12px' }}>
          <div style={{ display: 'flex', gap: 4 }}>
            {QUIZ_QS.map((_, i) => (
              <div key={i} style={{
                flex: 1, height: 4, borderRadius: 2,
                background: i < qi ? V9.success : i === qi ? V9.ink900 : V9.ink200,
              }}/>
            ))}
          </div>
        </div>
        <div style={{ width: 40, textAlign: 'right', fontSize: 12, color: V9.ink500, fontFamily: V9.mono }}>{qi + 1}/{total}</div>
      </div>

      <div style={{ flex: 1, overflowY: 'auto', padding: '16px 20px 16px' }}>
        <div style={{ fontSize: 11, fontFamily: V9.mono, color: V9.red500, textTransform: 'uppercase', letterSpacing: 0.08, marginBottom: 10 }}>Pitanje {qi + 1}</div>
        <div style={{ fontSize: 20, fontWeight: 600, letterSpacing: -0.4, color: V9.ink900, lineHeight: 1.3, marginBottom: 20 }}>{q.q}</div>

        <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
          {q.opts.map((opt, i) => {
            const isPicked = picked === i;
            const isCorrect = i === q.correct;
            let bg = 'white', bord = V9.ink200, fg = V9.ink900, dotBg = 'white', dotBorder = V9.ink300, dotFg = 'transparent';
            if (showFeedback) {
              if (isPicked && isCorrect) { bg = V9.successBg; bord = V9.success; dotBg = V9.success; dotBorder = V9.success; dotFg = 'white'; }
              else if (isPicked && !isCorrect) { bg = V9.dangerBg; bord = V9.danger; dotBg = V9.danger; dotBorder = V9.danger; dotFg = 'white'; }
              else if (isCorrect) { bg = V9.successBg; bord = V9.success; dotBg = V9.success; dotBorder = V9.success; dotFg = 'white'; }
              else { fg = V9.ink500; }
            } else if (isPicked) {
              bord = V9.ink900; dotBg = V9.ink900; dotBorder = V9.ink900; dotFg = 'white';
            }
            return (
              <Tap9 key={i} onClick={() => !showFeedback && setPicked(i)} style={{
                display: 'flex', gap: 12, padding: 14,
                background: bg, border: '1px solid ' + bord, borderRadius: 12, textAlign: 'left',
                cursor: showFeedback ? 'default' : 'pointer',
              }}>
                <div style={{
                  flexShrink: 0, width: 22, height: 22, borderRadius: '50%',
                  background: dotBg, border: '2px solid ' + dotBorder,
                  display: 'grid', placeItems: 'center', color: dotFg, marginTop: 1,
                }}>
                  {showFeedback && isPicked && isCorrect && <Chk9 size={13} sw={3}/>}
                  {showFeedback && isPicked && !isCorrect && <X9 size={13} sw={3}/>}
                  {showFeedback && !isPicked && isCorrect && <Chk9 size={13} sw={3}/>}
                </div>
                <div style={{ flex: 1, fontSize: 14, color: fg, lineHeight: 1.45 }}>{opt}</div>
              </Tap9>
            );
          })}
        </div>

        {showFeedback && (
          <div style={{ marginTop: 16, padding: 14, background: picked === q.correct ? V9.successBg : V9.warningBg, border: '1px solid ' + (picked === q.correct ? V9.success : 'oklch(0.85 0.1 70)'), borderRadius: 12 }}>
            <div style={{ fontSize: 12, fontWeight: 600, color: picked === q.correct ? 'oklch(0.32 0.15 152)' : 'oklch(0.4 0.15 70)', marginBottom: 4, display: 'flex', alignItems: 'center', gap: 6, textTransform: 'uppercase', letterSpacing: 0.04, fontFamily: V9.mono }}>
              {picked === q.correct ? <><Chk9 size={13} sw={2.6}/> Tačno</> : <>Skoro · evo zašto</>}
            </div>
            <div style={{ fontSize: 13, color: V9.ink700, lineHeight: 1.5 }}>{q.explanation}</div>
          </div>
        )}
      </div>

      <div style={{ padding: '12px 16px 36px', borderTop: '1px solid ' + V9.ink150 }}>
        <Tap9 onClick={next} disabled={picked == null} style={{
          width: '100%', height: 52,
          background: picked == null ? V9.ink200 : V9.ink950,
          color: picked == null ? V9.ink500 : 'white',
          borderRadius: 14, fontFamily: V9.font, fontSize: 15, fontWeight: 600,
          display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
        }}>
          {isLast ? 'Završi kviz' : 'Sledeće pitanje'} <Arrow9 size={17} sw={2.4}/>
        </Tap9>
      </div>
    </div>
  );
}

// ═════════════════════════════════════════════════════════════
// VIEW 4 — Quiz complete
// ═════════════════════════════════════════════════════════════
function QuizDone({ answers, onReset }) {
  const correct = answers.filter((a, i) => a === QUIZ_QS[i].correct).length;
  const pct = correct / QUIZ_QS.length;
  const passed = pct >= 0.6;
  return (
    <div style={{ background: V9.paper, height: '100%', display: 'flex', flexDirection: 'column', fontFamily: V9.font, color: V9.ink900 }}>
      <div style={{ paddingTop: 80, padding: '80px 24px 16px', flex: 1, display: 'flex', flexDirection: 'column' }}>
        <div style={{
          width: 72, height: 72, borderRadius: 20,
          background: passed ? V9.successBg : V9.warningBg,
          color: passed ? V9.success : V9.warning,
          display: 'grid', placeItems: 'center', marginBottom: 24,
          boxShadow: passed ? '0 0 0 8px oklch(0.62 0.155 152 / 0.1)' : 'none',
        }}>{passed ? <Cup size={34}/> : <Book9 size={28}/>}</div>

        <div style={{ fontSize: 26, fontWeight: 600, letterSpacing: -0.5, color: V9.ink900, lineHeight: 1.15, marginBottom: 8 }}>
          {passed ? 'Modul završen!' : 'Probaj još jednom'}
        </div>
        <div style={{ fontSize: 15, color: V9.ink600, lineHeight: 1.55, marginBottom: 24 }}>
          Tačnih odgovora: <strong style={{ color: V9.ink900 }}>{correct} od {QUIZ_QS.length}</strong> · {Math.round(pct * 100)}%
        </div>

        <div style={{ background: 'white', border: '1px solid ' + V9.ink200, borderRadius: 14, padding: '4px 0' }}>
          {QUIZ_QS.map((q, i) => {
            const ok = answers[i] === q.correct;
            return (
              <div key={i} style={{ display: 'flex', alignItems: 'flex-start', gap: 12, padding: '12px 16px', borderBottom: i === QUIZ_QS.length - 1 ? 'none' : '1px solid ' + V9.ink150 }}>
                <div style={{
                  width: 26, height: 26, borderRadius: '50%', flexShrink: 0,
                  background: ok ? V9.successBg : V9.dangerBg,
                  color: ok ? V9.success : V9.danger,
                  display: 'grid', placeItems: 'center',
                }}>{ok ? <Chk9 size={13} sw={2.6}/> : <X9 size={12} sw={2.6}/>}</div>
                <div style={{ flex: 1 }}>
                  <div style={{ fontSize: 13, color: V9.ink800, lineHeight: 1.4 }}>{q.q}</div>
                </div>
              </div>
            );
          })}
        </div>

        <div style={{ flex: 1 }}/>
      </div>
      <div style={{ padding: '12px 16px 36px' }}>
        <Tap9 onClick={onReset} style={{
          width: '100%', height: 52,
          background: V9.ink950, color: 'white',
          borderRadius: 14, fontFamily: V9.font, fontSize: 15, fontWeight: 600,
          display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
        }}>{passed ? 'Sledeći modul' : 'Probaj ponovo'} <Arrow9 size={17} sw={2.4}/></Tap9>
      </div>
    </div>
  );
}

// ─────────────────────────────────────────────────────────────
// Flow
// ─────────────────────────────────────────────────────────────
function TrainingFlow({ tweaks }) {
  const [view, setView] = React.useState(tweaks.view || 'list');
  const [moduleId, setModuleId] = React.useState(tweaks.module || 4);
  const [quizAnswers, setQuizAnswers] = React.useState(null);

  React.useEffect(() => { setView(tweaks.view || 'list'); }, [tweaks.view]);

  if (view === 'lesson')    return <LessonView moduleId={moduleId} onBack={() => setView('list')} onStartQuiz={() => setView('quiz')}/>;
  if (view === 'quiz')      return <QuizView onBack={() => setView('lesson')} onComplete={(a) => { setQuizAnswers(a); setView('done'); }}/>;
  if (view === 'done')      return <QuizDone answers={quizAnswers || [1, 1, 1]} onReset={() => { setQuizAnswers(null); setView('list'); }}/>;
  return <ListView onOpenModule={(id) => { setModuleId(id); setView('lesson'); }} onOpenQuiz={() => setView('quiz')}/>;
}

Object.assign(window, { TrainingFlow });
