// Shared UI components
const { useState, useEffect, useRef } = React;

const QUOTES = [
  { q: "Pain is weakness leaving the body.", a: "— Lore" },
  { q: "The only bad workout is the one that didn't happen.", a: "— You, later" },
  { q: "Sweat is just fat crying.", a: "— Gym floor" },
  { q: "You vs. you. That's the fight.", a: "— Coach V" },
  { q: "Don't wish for it. Work for it.", a: "— Everyone who made it" },
  { q: "One rep closer.", a: "— The mantra" },
];

function RotatingHype() {
  const [i, setI] = useState(0);
  useEffect(() => {
    const t = setInterval(() => setI(x => (x + 1) % QUOTES.length), 15000);
    return () => clearInterval(t);
  }, []);
  return (
    <div style={{ position: 'relative', height: 260 }}>
      {QUOTES.map((qq, idx) => (
        <div key={idx} style={{
          position: 'absolute', inset: 0,
          opacity: idx === i ? 1 : 0,
          transition: 'opacity .5s',
          transform: idx === i ? 'translateY(0)' : 'translateY(8px)',
        }}>
          <div className="display" style={{ fontSize: 'clamp(32px, 4vw, 60px)', lineHeight: 0.92 }}>{qq.q}</div>
          <div className="mono" style={{ marginTop: 14, fontSize: 12, letterSpacing: '0.2em', opacity: 0.5 }}>{qq.a}</div>
        </div>
      ))}
    </div>
  );
}

function Ticker({ items = [], variant = 'poster' }) {
  const content = (
    <>
      {items.map((it, i) => (
        <span key={i} style={{ display: 'inline-flex', alignItems: 'center', gap: 48 }}>
          <span className="display" style={{ fontSize: 64 }}>{it}</span>
          <span style={{ width: 10, height: 10, background: 'var(--accent)', borderRadius: '50%' }} />
        </span>
      ))}
    </>
  );
  const bg = variant === 'neon' ? '#0a0a0a' : '#f5f1e8';
  const fg = variant === 'neon' ? '#fff' : '#0a0a0a';
  return (
    <div style={{ background: bg, color: fg, overflow: 'hidden', padding: '20px 0', borderTop: '2px solid ' + fg, borderBottom: '2px solid ' + fg }}>
      <div className="ticker-track">
        {content}{content}
      </div>
    </div>
  );
}

function Nav({ view, setView, variant }) {
  const items = [
    { id: 'home', label: 'Train' },
    { id: 'chat', label: 'Coach' },
    { id: 'saved', label: 'Saved' },
    { id: 'history', label: 'History' },
  ];
  return (
    <header style={{
      position: 'sticky', top: 0, zIndex: 100,
      display: 'flex', alignItems: 'center', justifyContent: 'space-between',
      padding: '20px 32px',
      background: variant === 'neon' ? 'rgba(10,10,10,0.85)' : 'rgba(10,10,10,0.92)',
      backdropFilter: 'blur(12px)',
      borderBottom: '1px solid rgba(255,255,255,0.06)',
    }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 10, cursor: 'pointer' }} onClick={() => setView('home')}>
        <span className="display" style={{ fontSize: 22, letterSpacing: '0.02em' }}>SNATCH</span>
      </div>
      <nav style={{ display: 'flex', gap: 4 }}>
        {items.map(it => (
          <button key={it.id} onClick={() => setView(it.id)} style={{
            background: 'transparent', border: 0, cursor: 'pointer',
            color: view === it.id ? '#fff' : 'rgba(255,255,255,0.45)',
            fontFamily: 'Archivo', fontWeight: 700, fontSize: 13, letterSpacing: '0.12em', textTransform: 'uppercase',
            padding: '10px 16px', position: 'relative',
          }}>
            {it.label}
            {view === it.id && <span style={{ position: 'absolute', bottom: 2, left: 16, right: 16, height: 2, background: 'var(--accent)' }} />}
          </button>
        ))}
      </nav>
      <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
        <div style={{ width: 34, height: 34, borderRadius: '50%', background: 'linear-gradient(135deg, var(--accent), #ff8a3d)', border: '2px solid #fff' }} />
      </div>
    </header>
  );
}

function Stat({ label, value, accent }) {
  return (
    <div>
      <div className="mono" style={{ fontSize: 10, letterSpacing: '0.2em', opacity: 0.5, textTransform: 'uppercase' }}>{label}</div>
      <div className="display" style={{ fontSize: 24, marginTop: 6, color: accent ? 'var(--accent)' : '#fff' }}>{value}</div>
    </div>
  );
}

function PosterStat({ label, value }) {
  return (
    <div style={{ background: 'var(--paper)', padding: '18px 16px' }}>
      <div className="mono" style={{ fontSize: 10, letterSpacing: '0.22em', color: 'rgba(10,10,10,0.45)', textTransform: 'uppercase' }}>{label}</div>
      <div className="display" style={{ fontSize: 28, marginTop: 6, color: 'var(--ink)' }}>{value}</div>
    </div>
  );
}

function WodBlockPoster({ block, idx }) {
  return (
    <div>
      <div style={{ display: 'flex', alignItems: 'baseline', gap: 16, marginBottom: 14, paddingBottom: 10, borderBottom: '2px solid var(--ink)' }}>
        <span className="display" style={{ fontSize: 48, color: 'var(--accent)' }}>{String(idx+1).padStart(2,'0')}</span>
        <span className="display" style={{ fontSize: 32, color: 'var(--ink)' }}>{block.label}</span>
        <span className="mono" style={{ marginLeft: 'auto', fontSize: 14, color: 'rgba(10,10,10,0.55)' }}>{block.time}</span>
      </div>
      {block.note && <div style={{ fontSize: 14, fontStyle: 'italic', marginBottom: 12, color: 'rgba(10,10,10,0.7)' }}>{block.note}</div>}
      <ul style={{ listStyle: 'none', padding: 0, margin: 0 }}>
        {block.items.map((it, i) => (
          <li key={i} style={{ display: 'flex', justifyContent: 'space-between', padding: '10px 0', borderBottom: '1px dashed rgba(10,10,10,0.15)' }}>
            <span style={{ fontSize: 18, fontWeight: 600, color: 'var(--ink)' }}>
              <span className="mono" style={{ color: 'rgba(10,10,10,0.35)', marginRight: 14, fontSize: 13 }}>{String(i+1).padStart(2,'0')}</span>
              {it.name}
            </span>
            <span className="display" style={{ fontSize: 24, color: 'var(--ink)' }}>{it.reps}</span>
          </li>
        ))}
      </ul>
    </div>
  );
}

function WodBlockNeon({ block, idx }) {
  return (
    <div style={{ padding: 20, background: 'rgba(255,255,255,0.03)', border: '1px solid rgba(255,255,255,0.08)' }}>
      <div style={{ display: 'flex', alignItems: 'baseline', gap: 14, marginBottom: 14 }}>
        <span className="mono" style={{ fontSize: 11, color: 'var(--accent)', letterSpacing: '0.2em' }}>{String(idx+1).padStart(2,'0')}</span>
        <span className="display" style={{ fontSize: 22, color: '#fff' }}>{block.label}</span>
        <span className="mono" style={{ marginLeft: 'auto', fontSize: 12, color: 'rgba(255,255,255,0.5)' }}>{block.time}</span>
      </div>
      {block.note && <div style={{ fontSize: 13, marginBottom: 12, color: 'rgba(255,255,255,0.6)', fontStyle: 'italic' }}>{block.note}</div>}
      <ul style={{ listStyle: 'none', padding: 0, margin: 0 }}>
        {block.items.map((it, i) => (
          <li key={i} style={{ display: 'flex', justifyContent: 'space-between', padding: '8px 0', borderBottom: '1px solid rgba(255,255,255,0.06)' }}>
            <span style={{ fontSize: 15, color: '#fff' }}>{it.name}</span>
            <span className="mono" style={{ fontSize: 13, color: 'var(--accent)' }}>{it.reps}</span>
          </li>
        ))}
      </ul>
    </div>
  );
}

function WodPosterCard({ wod, variant = 'poster', onSave, onStart, saved }) {
  if (!wod) return null;
  const isNeon = variant === 'neon';

  if (isNeon) {
    return (
      <div className="slide-in" style={{
        background: '#0a0a0a',
        border: '1px solid var(--accent)',
        boxShadow: '0 0 0 1px rgba(255,255,255,0.04), 0 20px 60px rgba(0,0,0,0.6), 0 0 120px -40px var(--accent)',
        borderRadius: 4, padding: 36, color: '#fff',
        position: 'relative', overflow: 'hidden',
      }}>
        <div style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, background: 'var(--accent)' }} />
        <div style={{ position: 'absolute', top: 20, right: 24, display: 'flex', gap: 8 }}>
          <span className="mono" style={{ fontSize: 10, letterSpacing: '0.2em', color: 'var(--accent)' }}>● LIVE</span>
        </div>
        <div className="mono" style={{ fontSize: 11, letterSpacing: '0.25em', opacity: 0.5 }}>WOD · {new Date().toLocaleDateString('en-US', { month: 'short', day: 'numeric' }).toUpperCase()}</div>
        <div className="display" style={{ fontSize: 'clamp(56px, 9vw, 120px)', marginTop: 8, background: 'linear-gradient(180deg, #fff 0%, #fff 50%, var(--accent) 50%, var(--accent) 100%)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>{wod.title}</div>
        <div style={{ fontSize: 16, opacity: 0.7, marginTop: 6 }}>{wod.subtitle}</div>
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 16, marginTop: 28, padding: '20px 0', borderTop: '1px solid rgba(255,255,255,0.1)', borderBottom: '1px solid rgba(255,255,255,0.1)' }}>
          <Stat label="Duration" value={wod.duration} accent />
          <Stat label="Intensity" value={wod.intensity} />
          <Stat label="Focus" value={wod.focus} />
          <Stat label="Equipment" value={wod.equipment} />
        </div>
        <div style={{ marginTop: 28, display: 'grid', gap: 20 }}>
          {wod.blocks.map((b, i) => <WodBlockNeon key={i} block={b} idx={i} />)}
        </div>
        {wod.closer && (
          <div style={{ marginTop: 32, padding: '24px 0 0', borderTop: '1px solid rgba(255,255,255,0.1)' }}>
            <div className="display" style={{ fontSize: 28, color: 'var(--accent)' }}>"{wod.closer}"</div>
          </div>
        )}
        <div style={{ display: 'flex', gap: 12, marginTop: 28 }}>
          <button className="btn btn-primary" onClick={onStart}>▶ Start workout</button>
          <button className="btn btn-ghost" onClick={onSave}>{saved ? '✓ Saved' : '☆ Save'}</button>
        </div>
      </div>
    );
  }

  return (
    <div className="paper slide-in" style={{
      borderRadius: 2, padding: 48, position: 'relative', overflow: 'hidden',
      boxShadow: '0 30px 60px rgba(0,0,0,0.4), 0 0 0 1px rgba(0,0,0,0.05)',
    }}>
      <div style={{
        position: 'absolute', top: 36, right: 36,
        border: '3px solid var(--accent)', color: 'var(--accent)',
        padding: '8px 14px', transform: 'rotate(6deg)',
        fontFamily: 'Barlow Condensed', fontWeight: 900, fontSize: 14, letterSpacing: '0.1em',
      }}>
        COACH<br/>APPROVED
      </div>
      <div className="mono" style={{ fontSize: 11, letterSpacing: '0.25em', color: 'var(--accent)' }}>WOD · {new Date().toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }).toUpperCase()}</div>
      <div style={{ display: 'flex', alignItems: 'flex-end', gap: 0, marginTop: 12, flexWrap: 'wrap' }}>
        <div className="display" style={{ fontSize: 'clamp(64px, 11vw, 160px)', color: 'var(--ink)' }}>{wod.title}</div>
      </div>
      <div style={{ fontSize: 18, marginTop: 8, color: 'rgba(10,10,10,0.65)', fontWeight: 500 }}>{wod.subtitle}</div>
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 2, marginTop: 32, background: 'rgba(10,10,10,0.1)' }}>
        <PosterStat label="Duration" value={wod.duration} />
        <PosterStat label="Intensity" value={wod.intensity} />
        <PosterStat label="Focus" value={wod.focus} />
        <PosterStat label="Equipment" value={wod.equipment} />
      </div>
      <div style={{ marginTop: 36, display: 'grid', gap: 28 }}>
        {wod.blocks.map((b, i) => <WodBlockPoster key={i} block={b} idx={i} />)}
      </div>
      {wod.closer && (
        <div style={{ marginTop: 40, padding: '28px 0 0', borderTop: '2px solid var(--ink)' }}>
          <div className="display" style={{ fontSize: 'clamp(28px, 4vw, 48px)', color: 'var(--ink)' }}>"{wod.closer}"</div>
          <div className="mono" style={{ fontSize: 11, letterSpacing: '0.2em', marginTop: 8, color: 'rgba(10,10,10,0.5)' }}>— COACH V</div>
        </div>
      )}
      <div style={{ display: 'flex', gap: 10, marginTop: 36 }}>
        <button className="btn btn-primary" onClick={onStart}>▶ Start workout</button>
        <button className="btn btn-ink" onClick={onSave}>{saved ? '✓ Saved' : '☆ Save WOD'}</button>
      </div>
    </div>
  );
}

Object.assign(window, { RotatingHype, Ticker, Nav, WodPosterCard });
