// app-shared.jsx — Shared UI components for VantageBet prototype

/* ── Screen label (design reference only) ── */
function ScreenLabel({ label }) {
  return (
    <div style={{
      position:'absolute', top:6, left:6, zIndex:200, pointerEvents:'none',
      background:'rgba(0,0,0,0.5)', backdropFilter:'blur(4px)',
      borderRadius:4, padding:'2px 7px',
      fontFamily:'var(--font-body)', fontSize:9, color:'rgba(255,255,255,0.7)',
    }}>{label}</div>
  );
}

/* ── Back header for sub-screens ── */
function BackHeader({ title, onBack, rightSlot }) {
  return (
    <div style={{
      display:'flex', alignItems:'center', padding:'8px 14px', gap:10, flexShrink:0,
      background:'var(--color-nav-bg)', borderBottom:'1px solid var(--color-border-subtle)',
    }}>
      <button onClick={onBack} style={{
        width:36, height:36, borderRadius:9, flexShrink:0,
        display:'flex', alignItems:'center', justifyContent:'center',
        background:'var(--color-surface)', border:'1px solid var(--color-border)', cursor:'pointer',
      }}>
        <i className="ph ph-caret-left" style={{ fontSize:18, color:'var(--color-text-primary)' }} />
      </button>
      <span style={{ flex:1, fontFamily:'var(--font-display)', fontWeight:600, fontSize:16, color:'var(--color-text-primary)' }}>{title}</span>
      {rightSlot}
    </div>
  );
}

/* ── App header (main screens) ── */
function AppHeader({ dark, toggleDark, navigate, balance }) {
  const bal = (balance || 1325.83).toFixed(2);
  return (
    <div style={{
      display:'flex', alignItems:'center', justifyContent:'space-between',
      padding:'6px 14px', background:'var(--color-nav-bg)', flexShrink:0,
    }}>
      <div style={{ display:'flex', alignItems:'center', gap:7 }}>
        <div style={{ width:28, height:28, borderRadius:8, background:'var(--color-primary)', display:'flex', alignItems:'center', justifyContent:'center' }}>
          <i className="ph ph-poker-chip" style={{ fontSize:16, color:'#fff' }} />
        </div>
        <span style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:17, color:'var(--color-text-primary)', letterSpacing:-0.3 }}>
          Vantage<span style={{ color:'var(--color-primary)' }}>Bet</span>
        </span>
      </div>
      <div style={{ display:'flex', alignItems:'center', gap:6 }}>
        <button onClick={() => navigate && navigate('deposit')} style={{
          display:'flex', alignItems:'center', gap:5,
          background:'var(--color-surface)', border:'1px solid var(--color-border)',
          borderRadius:20, padding:'4px 10px', cursor:'pointer',
        }}>
          <i className="ph ph-wallet" style={{ fontSize:12, color:'var(--color-success)' }} />
          <span style={{ fontFamily:'var(--font-display)', fontWeight:600, fontSize:13, color:'var(--color-text-primary)', fontVariantNumeric:'tabular-nums' }}>€{bal}</span>
        </button>
        <button onClick={toggleDark} style={{ background:'none', border:'none', cursor:'pointer', padding:6, borderRadius:8, display:'flex', alignItems:'center' }}>
          <i className={`ph ${dark ? 'ph-sun' : 'ph-moon'}`} style={{ fontSize:18, color:'var(--color-text-muted)' }} />
        </button>
        <button style={{ position:'relative', background:'none', border:'none', cursor:'pointer', padding:6, borderRadius:8, display:'flex', alignItems:'center' }}>
          <i className="ph ph-bell" style={{ fontSize:19, color:'var(--color-text-secondary)' }} />
          <span style={{ position:'absolute', top:4, right:4, width:7, height:7, borderRadius:'50%', background:'var(--color-danger)', border:'1.5px solid var(--color-nav-bg)' }} />
        </button>
      </div>
    </div>
  );
}

/* ── Search bar ── */
function SearchBar({ placeholder = 'Find Games...' }) {
  return (
    <div style={{ padding:'8px 14px', background:'var(--color-nav-bg)', display:'flex', gap:8, flexShrink:0 }}>
      <div style={{ flex:1, height:38, borderRadius:10, background:'var(--color-surface)', border:'1px solid var(--color-border)', display:'flex', alignItems:'center', gap:8, padding:'0 12px' }}>
        <i className="ph ph-magnifying-glass" style={{ fontSize:15, color:'var(--color-text-muted)' }} />
        <span style={{ fontFamily:'var(--font-body)', fontSize:13, color:'var(--color-text-muted)' }}>{placeholder}</span>
      </div>
      <button style={{ width:38, height:38, borderRadius:10, background:'var(--color-surface)', border:'1px solid var(--color-border)', display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer' }}>
        <i className="ph ph-sliders-horizontal" style={{ fontSize:16, color:'var(--color-text-secondary)' }} />
      </button>
    </div>
  );
}

/* ── Section header ── */
function SectionHeader({ title, count, badge, onSeeAll }) {
  return (
    <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', padding:'0 16px', marginBottom:10 }}>
      <div style={{ display:'flex', alignItems:'center', gap:7 }}>
        <span style={{ fontFamily:'var(--font-display)', fontWeight:600, fontSize:15, color:'var(--color-text-primary)' }}>{title}</span>
        {badge === 'LIVE' && (
          <span style={{ display:'flex', alignItems:'center', gap:4, background:'rgba(239,91,91,0.18)', border:'1px solid rgba(239,91,91,0.4)', borderRadius:5, padding:'2px 6px', fontSize:9, fontWeight:700, color:'var(--color-danger)', letterSpacing:0.5 }}>
            <span style={{ width:5, height:5, borderRadius:'50%', background:'var(--color-danger)', display:'inline-block', animation:'pulse-live 1.5s ease-in-out infinite' }} />
            LIVE
          </span>
        )}
      </div>
      <button onClick={onSeeAll} style={{ background:'none', border:'none', cursor:'pointer', display:'flex', alignItems:'center', gap:2, fontFamily:'var(--font-body)', fontSize:12, color:'var(--color-primary)', fontWeight:500, padding:0 }}>
        See all {count && <span style={{ color:'var(--color-text-muted)' }}>({count})</span>}
        <i className="ph ph-caret-right" style={{ fontSize:11 }} />
      </button>
    </div>
  );
}

/* ── Game tile ── */
function GameTile({ game, w=112, h=140, rank=null, showMeta=true, onClick }) {
  const [pressed, setPressed] = React.useState(false);
  const [fav, setFav] = React.useState(false);
  const badgeColor = { LIVE:'var(--color-danger)', JACKPOT:'var(--color-success)', NEW:'var(--color-primary)', HOT:'#F5484A', FEATURED:'var(--color-warning)' };
  return (
    <div onClick={() => onClick && onClick(game)} onMouseDown={() => setPressed(true)} onMouseUp={() => setPressed(false)} onMouseLeave={() => setPressed(false)}
      style={{ position:'relative', flexShrink:0, width:w, cursor:'pointer', transform:pressed?'scale(0.96)':'scale(1)', transition:'transform 0.12s ease' }}>
      <div style={{ width:w, height:h, borderRadius:14, overflow:'hidden', position:'relative', border:'1px solid rgba(255,255,255,0.07)', boxShadow:'inset 0 -40px 40px -30px rgba(0,0,0,0.9)' }}>
        <GameArt game={game} />
        {/* bottom scrim + title */}
        <div style={{ position:'absolute', left:0, right:0, bottom:0, padding:'18px 9px 8px', background:'linear-gradient(180deg,transparent,rgba(0,0,0,0.82))' }}>
          <div style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:w<=96?10.5:12, color:'#fff', lineHeight:1.15, letterSpacing:0.1, textShadow:'0 1px 6px rgba(0,0,0,0.9)' }}>{game.name}</div>
          {showMeta && <div style={{ fontFamily:'var(--font-body)', fontSize:9, color:'rgba(255,255,255,0.62)', marginTop:2 }}>{game.provider}</div>}
        </div>
        {rank != null && (
          <div style={{ position:'absolute', top:6, left:6, minWidth:20, height:20, padding:'0 5px', borderRadius:6, background:'rgba(0,0,0,0.6)', backdropFilter:'blur(4px)', border:'1px solid rgba(255,255,255,0.15)', display:'flex', alignItems:'center', justifyContent:'center', fontFamily:'var(--font-display)', fontWeight:800, fontSize:10, color:'#fff' }}>{rank}</div>
        )}
        {game.badge && rank == null && (
          <div style={{ position:'absolute', top:6, left:6, background:badgeColor[game.badge]||'#D44040', borderRadius:5, padding:'2px 6px', fontFamily:'var(--font-body)', fontWeight:800, fontSize:8, letterSpacing:0.4, color:'#fff', display:'flex', alignItems:'center', gap:3, boxShadow:'0 2px 6px rgba(0,0,0,0.4)' }}>
            {game.badge==='LIVE' && <span style={{ width:5, height:5, borderRadius:'50%', background:'#fff', animation:'pulse-live 1.5s infinite' }} />}
            {game.badge}
          </div>
        )}
        {/* favourite */}
        <button onClick={(e) => { e.stopPropagation(); setFav(f=>!f); }} style={{ position:'absolute', top:5, right:5, width:24, height:24, borderRadius:8, background:'rgba(0,0,0,0.42)', backdropFilter:'blur(4px)', border:'none', cursor:'pointer', display:'flex', alignItems:'center', justifyContent:'center', padding:0 }}>
          <i className={fav?'ph-fill ph-heart':'ph ph-heart'} style={{ fontSize:13, color:fav?'#FF5C7A':'rgba(255,255,255,0.85)' }} />
        </button>
        {game.players && (
          <div style={{ position:'absolute', top:34, right:5, background:'rgba(0,0,0,0.55)', backdropFilter:'blur(4px)', borderRadius:5, padding:'2px 5px', display:'flex', alignItems:'center', gap:3 }}>
            <i className="ph ph-users" style={{ fontSize:8, color:'#fff' }} />
            <span style={{ fontSize:8, color:'#fff', fontWeight:600 }}>{game.players}</span>
          </div>
        )}
      </div>
    </div>
  );
}

/* ── Game grid tile (2-col, art + meta below) ── */
function GameGridTile({ game, onClick }) {
  const [pressed, setPressed] = React.useState(false);
  const [fav, setFav] = React.useState(false);
  const badgeColor = { LIVE:'var(--color-danger)', JACKPOT:'var(--color-success)', NEW:'var(--color-primary)', HOT:'#F5484A', FEATURED:'var(--color-warning)' };
  return (
    <div onClick={() => onClick && onClick(game)} onMouseDown={() => setPressed(true)} onMouseUp={() => setPressed(false)} onMouseLeave={() => setPressed(false)}
      style={{ cursor:'pointer', transform:pressed?'scale(0.97)':'scale(1)', transition:'transform 0.12s ease' }}>
      <div style={{ width:'100%', aspectRatio:'4/5', borderRadius:14, overflow:'hidden', position:'relative', border:'1px solid rgba(255,255,255,0.07)', marginBottom:7 }}>
        <GameArt game={game} />
        <div style={{ position:'absolute', left:0, right:0, bottom:0, height:'45%', background:'linear-gradient(180deg,transparent,rgba(0,0,0,0.35))' }} />
        {game.badge && (
          <div style={{ position:'absolute', top:7, left:7, background:badgeColor[game.badge]||'#D44040', borderRadius:5, padding:'2px 6px', fontFamily:'var(--font-body)', fontWeight:800, fontSize:9, letterSpacing:0.4, color:'#fff', display:'flex', alignItems:'center', gap:3, boxShadow:'0 2px 6px rgba(0,0,0,0.4)' }}>
            {game.badge==='LIVE' && <span style={{ width:5, height:5, borderRadius:'50%', background:'#fff', animation:'pulse-live 1.5s infinite' }} />}
            {game.badge}
          </div>
        )}
        <button onClick={(e) => { e.stopPropagation(); setFav(f=>!f); }} style={{ position:'absolute', top:6, right:6, width:26, height:26, borderRadius:8, background:'rgba(0,0,0,0.42)', backdropFilter:'blur(4px)', border:'none', cursor:'pointer', display:'flex', alignItems:'center', justifyContent:'center', padding:0 }}>
          <i className={fav?'ph-fill ph-heart':'ph ph-heart'} style={{ fontSize:14, color:fav?'#FF5C7A':'rgba(255,255,255,0.85)' }} />
        </button>
        {game.players && (
          <div style={{ position:'absolute', bottom:7, left:7, background:'rgba(0,0,0,0.55)', backdropFilter:'blur(4px)', borderRadius:5, padding:'2px 6px', display:'flex', alignItems:'center', gap:3 }}>
            <i className="ph ph-users" style={{ fontSize:9, color:'#fff' }} />
            <span style={{ fontSize:9, color:'#fff', fontWeight:600 }}>{game.players} playing</span>
          </div>
        )}
      </div>
      <div style={{ fontFamily:'var(--font-display)', fontWeight:600, fontSize:12.5, color:'var(--color-text-primary)', marginBottom:2 }}>{game.name}</div>
      <div style={{ display:'flex', justifyContent:'space-between', alignItems:'center' }}>
        <span style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--color-text-muted)' }}>{game.provider}</span>
        <span style={{ fontFamily:'var(--font-body)', fontSize:10.5, color:'var(--color-accent)', fontWeight:600 }}>RTP {game.rtp}</span>
      </div>
    </div>
  );
}

function GameGrid({ games, onGameClick }) {
  return (
    <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:12, padding:'0 16px' }}>
      {games.map(g => <GameGridTile key={g.id} game={g} onClick={onGameClick} />)}
    </div>
  );
}

/* ── Game row (horizontal scroll) ── */
function GameRow({ games, w=112, h=140, showRank=false, onGameClick }) {
  return (
    <div style={{ display:'flex', gap:8, overflowX:'auto', padding:'0 16px 2px', scrollSnapType:'x mandatory', WebkitOverflowScrolling:'touch' }}>
      {games.map((g,i) => (
        <div key={g.id} style={{ scrollSnapAlign:'start', flexShrink:0 }}>
          <GameTile game={g} w={w} h={h} rank={showRank?i+1:null} onClick={onGameClick} />
        </div>
      ))}
    </div>
  );
}

/* ── Team badge circle ── */
function TeamBadge({ initials, color, size=36 }) {
  return (
    <div style={{ width:size, height:size, borderRadius:'50%', background:color+'28', border:`1.5px solid ${color}50`, display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
      <span style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:size/3.2, color:color }}>{initials}</span>
    </div>
  );
}

/* ── Odds button ── */
function OddsBtn({ label, value, selected, onClick }) {
  return (
    <button onClick={onClick} style={{ flex:1, height:44, borderRadius:10, background:selected?'var(--color-primary)':'var(--color-odds-bg)', border:selected?'none':'1px solid var(--color-border)', cursor:'pointer', display:'flex', flexDirection:'column', alignItems:'center', justifyContent:'center', gap:2, transition:'all 0.15s ease' }}>
      {label && <span style={{ fontFamily:'var(--font-body)', fontSize:10, fontWeight:500, color:selected?'rgba(255,255,255,0.7)':'var(--color-text-muted)' }}>{label}</span>}
      <span style={{ fontFamily:'var(--font-display)', fontWeight:700, fontSize:14, color:selected?'#fff':'var(--color-text-primary)', fontVariantNumeric:'tabular-nums' }}>{value}</span>
    </button>
  );
}

/* ── Divider ── */
function Divider({ mx=16 }) {
  return <div style={{ height:1, background:'var(--color-border-subtle)', margin:`0 ${mx}px` }} />;
}

/* ── Empty state ── */
function EmptyState({ icon, title, body, cta, onCta }) {
  return (
    <div style={{ display:'flex', flexDirection:'column', alignItems:'center', padding:'40px 32px', textAlign:'center' }}>
      <div style={{ width:64, height:64, borderRadius:20, background:'var(--color-surface)', border:'1px solid var(--color-border)', display:'flex', alignItems:'center', justifyContent:'center', marginBottom:16 }}>
        <i className={`ph ${icon}`} style={{ fontSize:28, color:'var(--color-text-muted)' }} />
      </div>
      <div style={{ fontFamily:'var(--font-display)', fontWeight:600, fontSize:16, color:'var(--color-text-primary)', marginBottom:8 }}>{title}</div>
      <div style={{ fontFamily:'var(--font-body)', fontSize:13, color:'var(--color-text-secondary)', lineHeight:1.5, marginBottom:20 }}>{body}</div>
      {cta && <button onClick={onCta} style={{ height:40, padding:'0 20px', borderRadius:10, background:'var(--color-primary)', border:'none', cursor:'pointer', fontFamily:'var(--font-body)', fontSize:13, fontWeight:600, color:'#fff' }}>{cta}</button>}
    </div>
  );
}

/* ── Progress bar ── */
function LimitBar({ pct }) {
  const color = pct >= 100 ? 'var(--color-danger)' : pct >= 80 ? 'var(--color-warning)' : 'var(--color-primary)';
  return (
    <div style={{ height:6, borderRadius:3, background:'var(--color-border)', overflow:'hidden' }}>
      <div style={{ height:'100%', width:`${Math.min(pct,100)}%`, borderRadius:3, background:color, transition:'width 0.3s ease' }} />
    </div>
  );
}

Object.assign(window, {
  ScreenLabel, BackHeader, AppHeader, SearchBar,
  SectionHeader, GameTile, GameGrid, GameGridTile, GameRow, TeamBadge, OddsBtn,
  Divider, EmptyState, LimitBar,
});
