/* ============================================
   TRACK DETAIL — waveform, rating, comments
   ============================================ */
function TrackDetailScreen({ track, onPlay, onShare, currentTrack, isPlaying, likedTrackIds, onToggleLike }) {
  const toast = useToast();
  const [myRating, setMyRating] = React.useState(() => {
    try { return JSON.parse(localStorage.getItem('ams-ratings') || '{}')[track.id] || 0; } catch { return 0; }
  });
  const [liked, setLiked] = React.useState(() => likedTrackIds?.has(track.id) || false);
  const [commentText, setCommentText] = React.useState('');
  const [commentTime, setCommentTime] = React.useState(null); // sec into track
  const [comments, setComments] = React.useState(() => (window.COMMENTS || COMMENTS).filter(c => c.trackId === track.id && !c.flagged));
  const [progress, setProgress] = React.useState(0.35);
  const [showPlaylists, setShowPlaylists] = React.useState(false);
  const [playlists, setPlaylists] = React.useState(() => (window.PLAYLISTS || []).slice());

  // Sync liked when likedTrackIds prop changes (navigating between tracks)
  React.useEffect(() => {
    setLiked(likedTrackIds?.has(track.id) || false);
  }, [likedTrackIds, track.id]);

  React.useEffect(() => {
    const h = () => setPlaylists((window.PLAYLISTS || []).slice());
    window.addEventListener('dataLoaded', h);
    return () => window.removeEventListener('dataLoaded', h);
  }, []);

  const addToPlaylist = async (playlist) => {
    setShowPlaylists(false);
    if (playlist.tracks && playlist.tracks.includes(track.id)) {
      toast(`Already in "${playlist.name}"`, 'info'); return;
    }
    const updatedTracks = [...(playlist.tracks || []), track.id];
    window.PLAYLISTS = (window.PLAYLISTS || []).map(p =>
      p.id === playlist.id ? { ...p, tracks: updatedTracks } : p
    );
    window.dispatchEvent(new CustomEvent('dataLoaded'));
    toast(`Added to "${playlist.name}"`, 'success');
    try { await window.dbHelpers?.updatePlaylist(playlist.id, { tracks: updatedTracks }); }
    catch(e) { console.error(e); }
  };

  const handleRating = async (v) => {
    setMyRating(v);
    toast(`You rated this ${v} ★`, 'success');
    // Persist to localStorage
    try {
      const saved = JSON.parse(localStorage.getItem('ams-ratings') || '{}');
      saved[track.id] = v;
      localStorage.setItem('ams-ratings', JSON.stringify(saved));
    } catch {}
    // Update track's aggregate rating (best-effort)
    try {
      const tr = (window.TRACKS || []).find(t => t.id === track.id);
      if (tr) {
        const prevRatings = tr.ratings || 1;
        const newRatings = prevRatings + 1;
        const newRating = Math.round(((tr.rating || 0) * prevRatings + v) / newRatings * 10) / 10;
        window.TRACKS = (window.TRACKS || []).map(t =>
          t.id === track.id ? { ...t, rating: newRating, ratings: newRatings } : t
        );
        window.dispatchEvent(new CustomEvent('dataLoaded'));
        await window.dbHelpers?.updateTrack(track.id, { rating: newRating, ratings: newRatings });
      }
    } catch(e) { /* ignore */ }
  };

  const reportComment = async (commentId) => {
    const match = (window.COMMENTS || []).find(c => c.id === commentId);
    setComments(cs => cs.filter(c => c.id !== commentId));
    window.COMMENTS = (window.COMMENTS || []).map(c => c.id === commentId ? { ...c, flagged: true } : c);
    window.dispatchEvent(new CustomEvent('dataLoaded'));
    toast('Comment reported', 'info');
    if (match?.docId) {
      try { await window.dbHelpers?.updateComment?.(match.docId, { flagged: true }); }
      catch(e) { console.error(e); }
    }
  };

  const markers = comments.map(c => ({ id: c.id, t: c.t, name: c.user, text: c.text }));

  const addComment = async () => {
    if (!commentText.trim()) return;
    const t = commentTime !== null ? commentTime : progress;
    const timestamp = new Date().toISOString();
    const newC = {
      id: 'c' + Date.now(),
      trackId: track.id, user: 'You', hue: 200,
      text: commentText, t, time: formatTime(t * track.durationSec),
      when: 'just now', likes: 0, flagged: false, timestamp,
    };
    setComments([newC, ...comments]);
    window.COMMENTS = [newC, ...(window.COMMENTS || [])];
    window.dispatchEvent(new CustomEvent('dataLoaded'));
    setCommentText(''); setCommentTime(null);
    toast('Comment posted', 'success');
    try { await window.dbHelpers?.addComment(newC); } catch(e) { console.error(e); }
  };

  return (
    <div data-screen-label="04 Track detail">
      {/* TRACK HEADER */}
      <div className="glass track-header-grid" style={{ padding: 'var(--space-6)', display: 'grid', gridTemplateColumns: '260px 1fr', gap: 'var(--space-6)', marginBottom: 'var(--space-5)' }}>
        <div className="track-header-art" style={{ position: 'relative', width: 260, height: 260, borderRadius: 'var(--r-lg)', overflow: 'hidden', boxShadow: 'var(--shadow-2)' }}>
          <Art index={track.art} />
        </div>
        <div className="col gap-3" style={{ justifyContent: 'center' }}>
          <div className="row gap-2">
            <div className="eyebrow">{track.releasedDays < 7 ? 'NEW · ' : ''}TRACK</div>
            <span className={`track-tag ${track.tag === 'ai' ? 'ai' : (track.tag === 'human' ? 'human' : '')}`}>{track.tag}</span>
          </div>
          <h1 className="h1 track-detail-title" style={{ fontSize: 52, lineHeight: 1 }}>{track.title}</h1>
          <div className="row gap-3" style={{ alignItems: 'center' }}>
            <Avatar name={track.artist} hue={280} />
            <div className="col">
              <div style={{ fontWeight: 600 }}>{track.artist}</div>
              <div className="fg-2 mono" style={{ fontSize: 11 }}>{track.author}</div>
            </div>
          </div>
          <div className="row gap-4 mono fg-2 track-stats-row" style={{ fontSize: 12, marginTop: 6, flexWrap: 'wrap' }}>
            <span><strong style={{ color: 'var(--fg-0)', fontSize: 16 }}>{(track.plays / 1000).toFixed(1)}k</strong> plays</span>
            <span><strong style={{ color: 'var(--fg-0)', fontSize: 16 }}>{(track.likes / 1000).toFixed(1)}k</strong> likes</span>
            <span><strong style={{ color: 'var(--fg-0)', fontSize: 16 }}>{track.comments}</strong> comments</span>
            <span><strong style={{ color: 'var(--fg-0)', fontSize: 16 }}>{track.duration}</strong></span>
          </div>
          <div className="row gap-2 track-action-row" style={{ marginTop: 12, flexWrap: 'wrap' }}>
            <button className="btn btn-primary btn-lg" onClick={() => onPlay(track)}>
              <Icon name={currentTrack && currentTrack.id === track.id && isPlaying ? 'pause' : 'play'} size={14} />
              {currentTrack && currentTrack.id === track.id && isPlaying ? 'Pause' : 'Play'}
            </button>
            <button
              className={`btn ${liked ? 'btn-primary' : 'btn-glass'}`}
              onClick={() => {
                const next = !liked;
                setLiked(next);
                onToggleLike?.(track.id);
                toast(next ? 'Added to library' : 'Removed from library', next ? 'success' : 'info');
              }}
            >
              <Icon name={liked ? 'heart-fill' : 'heart'} size={14} /> {liked ? 'Liked' : 'Like'}
            </button>
            <button className="btn btn-glass" onClick={() => onShare(track)}>
              <Icon name="share" size={14} /> Share
            </button>
            <div style={{ position: 'relative' }}>
              <button className="btn btn-glass" onClick={() => setShowPlaylists(s => !s)}>
                <Icon name="plus" size={14} /> Add to playlist
              </button>
              {showPlaylists && (
                <React.Fragment>
                  <div style={{ position: 'fixed', inset: 0, zIndex: 99 }} onClick={() => setShowPlaylists(false)} />
                  <div className="glass glass-strong" style={{
                    position: 'absolute', top: 'calc(100% + 6px)', left: 0,
                    minWidth: 220, zIndex: 100, borderRadius: 14,
                    border: '1px solid var(--line)', padding: 6, boxShadow: 'var(--shadow-2)',
                  }}>
                    {playlists.length === 0
                      ? <div style={{ padding: '10px 14px', fontSize: 12, color: 'var(--fg-3)' }}>No playlists yet — create one first</div>
                      : playlists.map(p => (
                        <button key={p.id} onClick={() => addToPlaylist(p)} style={{
                          display: 'flex', width: '100%', alignItems: 'center', gap: 10,
                          padding: '9px 12px', background: 'none', border: 'none',
                          color: 'var(--fg-0)', cursor: 'pointer', borderRadius: 10,
                          fontSize: 13, textAlign: 'left',
                        }}
                          onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-1)'}
                          onMouseLeave={e => e.currentTarget.style.background = 'none'}
                        >
                          <span style={{ fontSize: 18, lineHeight: 1 }}>{p.name?.split(' ').pop() || '🎵'}</span>
                          <span style={{ flex: 1 }}>{p.name}</span>
                          {p.tracks && p.tracks.includes(track.id) && <Icon name="check" size={13} style={{ color: 'var(--accent)', flexShrink: 0 }} />}
                        </button>
                      ))
                    }
                  </div>
                </React.Fragment>
              )}
            </div>
            <button className="icon-btn" style={{ marginLeft: 'auto' }}><Icon name="more" size={16} /></button>
          </div>
        </div>
      </div>

      {/* WAVEFORM with comment markers */}
      <div className="glass" style={{ padding: 'var(--space-5)', marginBottom: 'var(--space-5)' }}>
        <div className="row" style={{ justifyContent: 'space-between', marginBottom: 12 }}>
          <div>
            <div className="eyebrow">Waveform · click anywhere to seek</div>
            <div style={{ fontSize: 13, marginTop: 4 }} className="fg-2">
              Pins are comments posted at that moment. Hover to preview.
            </div>
          </div>
          <div className="row gap-2 mono fg-2" style={{ fontSize: 12 }}>
            {formatTime(progress * track.durationSec)} <span className="fg-3">/</span> {track.duration}
          </div>
        </div>
        <Waveform progress={progress} markers={markers} onSeek={setProgress} />
      </div>

      {/* RATING + COMMENT COMPOSER */}
      <div className="track-lower-grid" style={{ display: 'grid', gridTemplateColumns: '1fr 1.6fr', gap: 'var(--space-5)' }}>
        {/* Rating panel */}
        <div className="glass" style={{ padding: 'var(--space-5)' }}>
          <div className="eyebrow">Community rating</div>
          <div className="rating-summary" style={{ marginTop: 6 }}>
            <span className="big">{track.rating}</span>
            <span className="out-of">/ 5.0</span>
          </div>
          <div className="row gap-2" style={{ marginTop: 6 }}>
            <StarRating value={track.rating} readonly size={14} />
            <span className="mono fg-3" style={{ fontSize: 11 }}>({track.ratings} ratings)</span>
          </div>

          {/* Histogram */}
          <div className="col gap-2" style={{ marginTop: 18 }}>
            {[5,4,3,2,1].map(stars => {
              const pct = stars === 5 ? 72 : stars === 4 ? 18 : stars === 3 ? 6 : stars === 2 ? 3 : 1;
              return (
                <div className="row gap-2" key={stars} style={{ fontSize: 11 }}>
                  <span className="mono fg-3" style={{ width: 14 }}>{stars}★</span>
                  <div style={{ flex: 1, height: 6, background: 'var(--line)', borderRadius: 999, overflow: 'hidden' }}>
                    <div style={{ width: pct + '%', height: '100%', background: 'linear-gradient(90deg, var(--accent), var(--accent-2))', borderRadius: 999 }} />
                  </div>
                  <span className="mono fg-3" style={{ width: 30, textAlign: 'right' }}>{pct}%</span>
                </div>
              );
            })}
          </div>

          <div className="divider-line" />

          <div className="eyebrow">Your rating</div>
          <div className="row gap-3" style={{ marginTop: 8, alignItems: 'center' }}>
            <StarRating value={myRating} onChange={handleRating} size={26} />
            {myRating > 0 && <span className="mono fg-2" style={{ fontSize: 12 }}>{myRating}/5</span>}
          </div>
          {myRating === 0 && <div className="fg-3" style={{ fontSize: 12, marginTop: 8 }}>Tap a star to rate this track.</div>}
        </div>

        {/* Comments */}
        <div className="glass" style={{ padding: 'var(--space-5)' }}>
          <div className="section-head" style={{ marginBottom: 'var(--space-4)' }}>
            <div>
              <div className="eyebrow">Discussion</div>
              <h3 className="h3" style={{ marginTop: 4 }}>Comments · {comments.length}</h3>
            </div>
            <div className="chip-row">
              <button className="chip active">Top</button>
              <button className="chip">New</button>
            </div>
          </div>

          {/* Composer */}
          <div className="row gap-3" style={{ alignItems: 'flex-start', marginBottom: 'var(--space-4)' }}>
            <Avatar name="You" hue={200} />
            <div className="col" style={{ flex: 1 }}>
              <textarea
                className="input"
                placeholder={`Comment at ${formatTime((commentTime !== null ? commentTime : progress) * track.durationSec)}…`}
                value={commentText}
                onChange={e => setCommentText(e.target.value)}
                rows={2}
                style={{ minHeight: 60 }}
              />
              <div className="row gap-2" style={{ marginTop: 8 }}>
                <button className="chip" onClick={() => setCommentTime(progress)}>
                  📍 Pin at {formatTime(progress * track.durationSec)}
                </button>
                {commentTime !== null && (
                  <button className="chip" onClick={() => setCommentTime(null)}>
                    <Icon name="x" size={10} /> Clear pin
                  </button>
                )}
                <div className="spacer" />
                <button className="btn btn-primary btn-sm" onClick={addComment} disabled={!commentText.trim()}>
                  Post comment
                </button>
              </div>
            </div>
          </div>

          {/* Comments list */}
          <div>
            {comments.length === 0 && (
              <div className="fg-3" style={{ textAlign: 'center', padding: '24px 0', fontSize: 13 }}>
                No comments yet. Be the first.
              </div>
            )}
            {comments.map(c => (
              <div className="comment" key={c.id}>
                <Avatar name={c.user} size="sm" hue={c.hue} />
                <div className="comment-body">
                  <div className="comment-head">
                    <span className="comment-name">{c.user}</span>
                    <span className="comment-timestamp" onClick={() => setProgress(c.t)}>@ {c.time}</span>
                    <span className="comment-time">· {c.when}</span>
                  </div>
                  <div className="comment-text">{c.text}</div>
                  <div className="comment-actions">
                    <button><Icon name="heart" size={11} /> {c.likes}</button>
                    <button><Icon name="message" size={11} /> Reply</button>
                    <button onClick={() => reportComment(c.id)}><Icon name="flag" size={11} /> Report</button>
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

function formatTime(sec) {
  const m = Math.floor(sec / 60);
  const s = Math.floor(sec % 60);
  return `${m}:${String(s).padStart(2, '0')}`;
}

/* ============================================
   PROFILE / HISTORY
   ============================================ */
function EditProfileModal({ open, user, onClose, onSave }) {
  const [name, setName]     = React.useState(user?.name || '');
  const [handle, setHandle] = React.useState(user?.handle || '');
  React.useEffect(() => {
    if (open) { setName(user?.name || ''); setHandle(user?.handle || ''); }
  }, [open, user?.name, user?.handle]);
  if (!open) return null;
  const valid = name.trim().length > 0 && handle.trim().length > 0;
  return (
    <div className="modal-backdrop" onClick={onClose}>
      <div className="modal glass glass-strong" onClick={e => e.stopPropagation()}>
        <div className="modal-head">
          <div>
            <div className="eyebrow">Account</div>
            <div className="modal-title">Edit profile</div>
          </div>
          <button className="modal-close" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>
        <div className="col gap-4">
          {user?.avatar && (
            <div className="row gap-3" style={{ alignItems: 'center' }}>
              <img src={user.avatar} alt="avatar" style={{ width: 64, height: 64, borderRadius: '50%', objectFit: 'cover' }} />
              <div className="fg-2" style={{ fontSize: 12 }}>Profile photo is synced from your Google account.</div>
            </div>
          )}
          <div className="field">
            <label className="field-label">Display name</label>
            <input className="input" value={name} onChange={e => setName(e.target.value)} placeholder="Your name" />
          </div>
          <div className="field">
            <label className="field-label">Handle</label>
            <div style={{ position: 'relative' }}>
              <span style={{ position: 'absolute', left: 12, top: '50%', transform: 'translateY(-50%)', color: 'var(--fg-3)', fontSize: 14 }}>@</span>
              <input className="input" style={{ paddingLeft: 26 }} value={handle}
                onChange={e => setHandle(e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, ''))}
                placeholder="yourhandle" />
            </div>
          </div>
          <button className="btn btn-primary btn-block" disabled={!valid}
            onClick={() => valid && onSave({ name: name.trim(), handle: handle.trim() })}>
            Save changes
          </button>
        </div>
      </div>
    </div>
  );
}

function ProfileScreen({ user, onPlay, onOpenTrack, onShare, onCreatePlaylist, onLogout, onUpdateUser, onEditProfile, theme, onToggleTheme, likedTrackIds }) {
  const [tab, setTab] = React.useState('history');
  const [gearOpen, setGearOpen] = React.useState(false);
  const toast = useToast();
  const [, setTick] = React.useState(0);
  React.useEffect(() => {
    const h = () => setTick(t => t + 1);
    window.addEventListener('dataLoaded', h);
    return () => window.removeEventListener('dataLoaded', h);
  }, []);

  // Real stats computed from live data
  const allPlaylists = window.PLAYLISTS || [];
  const myPlaylists  = allPlaylists.filter(p => p.createdBy === user?.handle || p.createdBy === user?.name);
  const savedTrackIds = [...new Set(myPlaylists.flatMap(p => p.tracks || []))];
  const myComments   = (window.COMMENTS || []).filter(c =>
    c.user === user?.name || c.user === user?.handle || c.user === 'You'
  );

  // Genre breakdown from tracks in user's playlists
  const allTracks = window.TRACKS || TRACKS;
  const getGenre = t => {
    if (t.genre) return t.genre;
    const dash = t.title.indexOf(' — ');
    return dash !== -1 ? t.title.slice(dash + 3) : t.tag || 'Other';
  };
  const genreCounts = {};
  savedTrackIds.forEach(id => {
    const t = allTracks.find(tr => tr.id === id);
    if (t) { const g = getGenre(t); genreCounts[g] = (genreCounts[g] || 0) + 1; }
  });
  const topGenres = Object.entries(genreCounts)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 5)
    .map(([name, count]) => ({ name, pct: Math.round((count / savedTrackIds.length) * 100) }));

  return (
    <div data-screen-label="05 Profile">
      {/* Header */}
      <div className="glass" style={{ padding: 'var(--space-6)', marginBottom: 'var(--space-5)', display: 'grid', gridTemplateColumns: 'auto 1fr auto', gap: 'var(--space-5)', alignItems: 'center' }}>
        <Avatar name={user.name} size="xl" hue={user.hue} />
        <div>
          <div className="eyebrow">PROFILE</div>
          <h1 className="h1" style={{ fontSize: 36, marginTop: 4 }}>{user.name}</h1>
          <div className="row gap-4 fg-2 mono" style={{ fontSize: 12, marginTop: 8 }}>
            <span>@{user.handle}</span>
            <span>·</span>
            <span>Joined {user.joined}</span>
          </div>
        </div>
        <div className="row gap-2">
          <button className="btn btn-glass" onClick={() => onEditProfile?.()}>
            <Icon name="edit" size={14} /> Edit profile
          </button>
          <div style={{ position: 'relative' }}>
            <button className="btn btn-glass" onClick={() => setGearOpen(o => !o)}>
              <Icon name="settings" size={14} />
            </button>
            {gearOpen && (
              <React.Fragment>
                <div style={{ position: 'fixed', inset: 0, zIndex: 99 }} onClick={() => setGearOpen(false)} />
                <div className="glass glass-strong" style={{
                  position: 'absolute', right: 0, top: 'calc(100% + 6px)',
                  zIndex: 100, minWidth: 200, padding: 6,
                  borderRadius: 14, border: '1px solid var(--line)', boxShadow: 'var(--shadow-2)',
                }}>
                  <button onClick={() => { onToggleTheme?.(); setGearOpen(false); }} style={{
                    display: 'flex', width: '100%', alignItems: 'center', gap: 10,
                    padding: '10px 14px', background: 'none', border: 'none',
                    color: 'var(--fg-0)', cursor: 'pointer', borderRadius: 10, fontSize: 13,
                  }}
                    onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-1)'}
                    onMouseLeave={e => e.currentTarget.style.background = 'none'}
                  >
                    <Icon name={theme === 'dark' ? 'sun' : 'moon'} size={15} />
                    Switch to {theme === 'dark' ? 'light' : 'dark'} mode
                  </button>
                  <div style={{ height: 1, background: 'var(--line)', margin: '4px 8px' }} />
                  <button onClick={() => { setGearOpen(false); onLogout?.(); }} style={{
                    display: 'flex', width: '100%', alignItems: 'center', gap: 10,
                    padding: '10px 14px', background: 'none', border: 'none',
                    color: 'var(--danger, #f87171)', cursor: 'pointer', borderRadius: 10, fontSize: 13,
                  }}
                    onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-1)'}
                    onMouseLeave={e => e.currentTarget.style.background = 'none'}
                  >
                    <Icon name="logout" size={15} /> Sign out
                  </button>
                </div>
              </React.Fragment>
            )}
          </div>
        </div>
      </div>

      {/* Tabs */}
      <div className="chip-row" style={{ marginBottom: 'var(--space-5)' }}>
        {[
          { k: 'history', label: 'History', icon: 'history' },
          { k: 'playlists', label: 'Playlists', icon: 'list' },
          { k: 'liked', label: 'Liked', icon: 'heart' },
          { k: 'stats', label: 'Stats', icon: 'gauge' },
        ].map(t => (
          <button key={t.k} className={`chip ${tab === t.k ? 'active' : ''}`} onClick={() => setTab(t.k)}>
            <span style={{ marginRight: 6, verticalAlign: 'middle', display: 'inline-flex' }}><Icon name={t.icon} size={12} /></span>
            {t.label}
          </button>
        ))}
      </div>

      {tab === 'history' && (
        <div className="glass" style={{ padding: 'var(--space-5)' }}>
          <div className="eyebrow" style={{ marginBottom: 16 }}>Recently played</div>
          {(() => {
            const history = window.HISTORY || [];
            const trks = window.TRACKS || TRACKS;
            if (history.length === 0) {
              return (
                <div style={{ textAlign: 'center', padding: 'var(--space-6)', color: 'var(--fg-3)', fontSize: 13 }}>
                  🎵 Nothing played yet. Hit play on any track to get started.
                </div>
              );
            }
            return (
              <div className="track-list">
                {history.map((h, i) => {
                  const t = trks.find(x => x.id === h.trackId);
                  if (!t) return null;
                  return (
                    <div className="track-row" key={i} onClick={() => onOpenTrack(t)}>
                      <div className="idx">{String(i + 1).padStart(2, '0')}</div>
                      <div className="row-cover"><Art index={t.art} /></div>
                      <div className="col">
                        <div className="row-title">{t.title}</div>
                        <div className="row-sub">{t.artist}</div>
                      </div>
                      <div className="mono fg-3 row-sub-mobile-hide" style={{ fontSize: 11 }}>{h.when}</div>
                      <div className="row gap-2 row-rating" style={{ justifyContent: 'flex-end' }}>
                        <StarRating value={t.rating} readonly size={11} />
                      </div>
                      <div className="row-duration">{t.duration}</div>
                      <div className="row-actions">
                        <button className="icon-btn" onClick={e => { e.stopPropagation(); onPlay(t); }}><Icon name="play" size={14} /></button>
                      </div>
                    </div>
                  );
                })}
              </div>
            );
          })()}
        </div>
      )}

      {tab === 'playlists' && (
        <div>
          <div className="row" style={{ justifyContent: 'flex-end', marginBottom: 16 }}>
            <button className="btn btn-primary btn-sm" onClick={onCreatePlaylist}>
              <Icon name="plus" size={14} /> New playlist
            </button>
          </div>
          {(window.PLAYLISTS || []).length === 0 && (
            <div style={{ textAlign: 'center', padding: 'var(--space-7)', color: 'var(--fg-3)', fontSize: 13 }}>
              No playlists yet — create one to get started.
            </div>
          )}
          <div className="card-grid">
            {(window.PLAYLISTS || []).map(p => {
              const firstTrackId = p.tracks?.[0];
              const firstTrack = firstTrackId && (window.TRACKS || TRACKS).find(t => t.id === firstTrackId);
              return (
                <div className="track-card glass" key={p.id}>
                  <div className="track-cover">
                    <Art index={p.cover} className="cover-art" />
                    <button className="play-overlay" onClick={() => firstTrack && onPlay(firstTrack)}>
                      <Icon name="play" size={16} />
                    </button>
                  </div>
                  <div className="track-info">
                    <div className="track-title-line">
                      <div className="h4">{p.name}</div>
                    </div>
                    <div className="fg-2 mono" style={{ fontSize: 11 }}>{p.tracks.length} tracks · {p.plays.toLocaleString()} plays</div>
                    <div className="row gap-2" style={{ marginTop: 8 }}>
                      <button className="btn btn-glass btn-sm" style={{ flex: 1 }} onClick={() => onShare({ playlist: p })}>
                        <Icon name="share" size={12} /> Share
                      </button>
                      <button className="icon-btn"><Icon name="more" size={14} /></button>
                    </div>
                  </div>
                </div>
              );
            })}
          </div>
        </div>
      )}

      {tab === 'liked' && (
        <div className="glass" style={{ padding: 'var(--space-5)' }}>
          {(() => {
            const trks = window.TRACKS || TRACKS;
            const likedTracks = likedTrackIds?.size > 0
              ? trks.filter(t => likedTrackIds.has(t.id))
              : [];
            return (
              <React.Fragment>
                <div className="eyebrow" style={{ marginBottom: 16 }}>{likedTracks.length} liked tracks</div>
                {likedTracks.length === 0 ? (
                  <div style={{ textAlign: 'center', padding: 'var(--space-6)', color: 'var(--fg-3)', fontSize: 13 }}>
                    ❤️ No liked tracks yet. Open a track and hit Like to save it here.
                  </div>
                ) : (
                  <div className="track-list">
                    {likedTracks.map((t, i) => (
                      <div className="track-row" key={t.id} onClick={() => onOpenTrack(t)}>
                        <div className="idx">{String(i + 1).padStart(2, '0')}</div>
                        <div className="row-cover"><Art index={t.art} /></div>
                        <div className="col">
                          <div className="row-title">{t.title}</div>
                          <div className="row-sub">{t.artist}</div>
                        </div>
                        <div></div>
                        <div className="row gap-2 row-rating" style={{ justifyContent: 'flex-end' }}>
                          <StarRating value={t.rating} readonly size={11} />
                        </div>
                        <div className="row-duration">{t.duration}</div>
                        <div className="row-actions">
                          <button className="icon-btn" style={{ color: 'var(--accent)' }}
                            onClick={e => { e.stopPropagation(); onPlay(t); }}>
                            <Icon name="play" size={14} />
                          </button>
                        </div>
                      </div>
                    ))}
                  </div>
                )}
              </React.Fragment>
            );
          })()}
        </div>
      )}

      {tab === 'stats' && (
        <div className="stat-grid" style={{ gridTemplateColumns: 'repeat(3, 1fr)' }}>
          <div className="glass stat-card">
            <div className="stat-label">Playlists created</div>
            <div className="stat-value">{myPlaylists.length}</div>
            <div className="stat-delta" style={{ color: 'var(--fg-3)', fontSize: 11 }}>{savedTrackIds.length} track{savedTrackIds.length !== 1 ? 's' : ''} saved</div>
          </div>
          <div className="glass stat-card">
            <div className="stat-label">Comments posted</div>
            <div className="stat-value">{myComments.length}</div>
            <div className="stat-delta" style={{ color: 'var(--fg-3)', fontSize: 11 }}>across all tracks</div>
          </div>
          <div className="glass stat-card">
            <div className="stat-label">Liked tracks</div>
            <div className="stat-value">{likedTrackIds?.size || 0}</div>
            <div className="stat-delta" style={{ color: 'var(--fg-3)', fontSize: 11 }}>{user?.role === 'admin' ? '👑 Admin' : user?.role === 'co-admin' ? '🛡 Co-admin' : '🎧 Listener'}</div>
          </div>
          <div className="glass stat-card" style={{ gridColumn: 'span 3' }}>
            <div className="stat-label">Your playlist genres</div>
            {topGenres.length === 0
              ? <div className="fg-3" style={{ fontSize: 13, marginTop: 16, textAlign: 'center', padding: '20px 0' }}>
                  Add tracks to playlists to see your genre breakdown.
                </div>
              : <div className="row gap-4" style={{ marginTop: 12, alignItems: 'flex-end' }}>
                  {topGenres.map(g => (
                    <div key={g.name} className="col gap-2" style={{ flex: 1, alignItems: 'center' }}>
                      <div style={{ width: '100%', height: 120, background: 'var(--line)', borderRadius: 6, position: 'relative', overflow: 'hidden' }}>
                        <div style={{ position: 'absolute', bottom: 0, left: 0, right: 0, height: g.pct + '%', background: 'linear-gradient(180deg, var(--accent), var(--accent-2))', borderRadius: 6 }} />
                      </div>
                      <div className="mono fg-2" style={{ fontSize: 11 }}>{g.name}</div>
                    </div>
                  ))}
                </div>
            }
          </div>
        </div>
      )}
    </div>
  );
}

/* ============================================
   PLAYLIST DETAIL MODAL
   ============================================ */
function PlaylistDetailModal({ playlist, onClose, onPlay, onShare }) {
  const toast = useToast();
  const tracks = (playlist.tracks || [])
    .map(id => (window.TRACKS || []).find(t => t.id === id))
    .filter(Boolean);

  const triggerDownload = (filename, content, type) => {
    const a = Object.assign(document.createElement('a'), {
      href: URL.createObjectURL(new Blob([content], { type })),
      download: filename,
    });
    document.body.appendChild(a); a.click();
    setTimeout(() => { URL.revokeObjectURL(a.href); document.body.removeChild(a); }, 100);
  };

  const exportCSV = () => {
    const rows = [['Title', 'Artist', 'Tag', 'Duration', 'Plays'],
      ...tracks.map(t => [t.title, t.artist, t.tag, t.duration, t.plays])];
    const csv = rows.map(r => r.map(v => `"${String(v ?? '').replace(/"/g, '""')}"`).join(',')).join('\n');
    triggerDownload(playlist.name.replace(/[^\w\s-]/g, '').trim() + '.csv', csv, 'text/csv');
    toast('Exported as CSV', 'success');
  };

  const exportTXT = () => {
    const header = `${playlist.name}\n${'─'.repeat(40)}\n\n`;
    const body = tracks.map((t, i) => `${i + 1}. ${t.title} — ${t.artist} [${t.tag}] ${t.duration}`).join('\n');
    triggerDownload(playlist.name.replace(/[^\w\s-]/g, '').trim() + '.txt', header + body, 'text/plain');
    toast('Exported as TXT', 'success');
  };

  return (
    <div className="modal-backdrop" onClick={onClose}>
      <div className="modal glass glass-strong" style={{ maxWidth: 560, width: '100%' }} onClick={e => e.stopPropagation()}>
        <div className="modal-head">
          <div>
            <div className="eyebrow">{tracks.length} tracks · {playlist.shared ? 'Public' : 'Private'}</div>
            <div className="modal-title">{playlist.name}</div>
          </div>
          <button className="modal-close" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>

        <div className="row gap-2" style={{ marginBottom: 16, flexWrap: 'wrap' }}>
          <button className="btn btn-glass btn-sm" onClick={exportCSV}><Icon name="download" size={12} /> Export CSV</button>
          <button className="btn btn-glass btn-sm" onClick={exportTXT}><Icon name="download" size={12} /> Export TXT</button>
          <button className="btn btn-glass btn-sm" style={{ marginLeft: 'auto' }} onClick={() => { onShare({ playlist }); onClose(); }}>
            <Icon name="share" size={12} /> Share
          </button>
        </div>

        {tracks.length === 0
          ? <div style={{ textAlign: 'center', padding: '40px 0', color: 'var(--fg-3)', fontSize: 13 }}>
              No tracks yet — open any track and hit "Add to playlist".
            </div>
          : <div style={{ maxHeight: 400, overflowY: 'auto' }}>
              {tracks.map((t, i) => (
                <div key={t.id}
                  style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '8px 6px', borderRadius: 10, cursor: 'pointer' }}
                  onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-1)'}
                  onMouseLeave={e => e.currentTarget.style.background = 'none'}
                  onClick={() => { onPlay(t); onClose(); }}
                >
                  <span className="mono fg-3" style={{ width: 22, textAlign: 'right', fontSize: 11, flexShrink: 0 }}>{i + 1}</span>
                  <div style={{ width: 40, height: 40, borderRadius: 8, overflow: 'hidden', flexShrink: 0, position: 'relative' }}>
                    <Art index={t.art} />
                  </div>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{t.title}</div>
                    <div className="fg-2 mono" style={{ fontSize: 11 }}>{t.artist}</div>
                  </div>
                  <span className={`track-tag ${t.tag === 'ai' ? 'ai' : t.tag === 'human' ? 'human' : ''}`} style={{ fontSize: 9 }}>{t.tag}</span>
                  <span className="mono fg-3" style={{ fontSize: 11, flexShrink: 0 }}>{t.duration}</span>
                  <button className="icon-btn" style={{ flexShrink: 0 }}
                    onClick={e => { e.stopPropagation(); onPlay(t); onClose(); }}>
                    <Icon name="play" size={14} />
                  </button>
                </div>
              ))}
            </div>
        }
      </div>
    </div>
  );
}

/* ============================================
   PLAYLISTS LIST
   ============================================ */
function PlaylistsScreen({ onShare, onCreatePlaylist, onOpenTrack, onPlay }) {
  const [playlists, setPlaylists] = React.useState(() => (window.PLAYLISTS || PLAYLISTS).slice());
  const [menuPlaylist, setMenuPlaylist] = React.useState(null);
  const [detailPlaylist, setDetailPlaylist] = React.useState(null);
  const toast = useToast();

  React.useEffect(() => {
    const handler = () => setPlaylists((window.PLAYLISTS || []).slice());
    window.addEventListener('dataLoaded', handler);
    return () => window.removeEventListener('dataLoaded', handler);
  }, []);

  const triggerDownload = (filename, content, type) => {
    const a = Object.assign(document.createElement('a'), {
      href: URL.createObjectURL(new Blob([content], { type })),
      download: filename,
    });
    document.body.appendChild(a); a.click();
    setTimeout(() => { URL.revokeObjectURL(a.href); document.body.removeChild(a); }, 100);
  };

  const exportPlaylist = (playlist, fmt) => {
    const tracks = (playlist.tracks || [])
      .map(id => (window.TRACKS || []).find(t => t.id === id)).filter(Boolean);
    const safeName = playlist.name.replace(/[^\w\s-]/g, '').trim();
    if (fmt === 'csv') {
      const rows = [['Title','Artist','Tag','Duration','Plays'],
        ...tracks.map(t => [t.title, t.artist, t.tag, t.duration, t.plays])];
      triggerDownload(safeName + '.csv',
        rows.map(r => r.map(v => `"${String(v??'').replace(/"/g,'""')}"`).join(',')).join('\n'),
        'text/csv');
    } else {
      const header = `${playlist.name}\n${'─'.repeat(40)}\n\n`;
      triggerDownload(safeName + '.txt',
        header + tracks.map((t,i) => `${i+1}. ${t.title} — ${t.artist} [${t.tag}] ${t.duration}`).join('\n'),
        'text/plain');
    }
    toast(`Exported as ${fmt.toUpperCase()}`, 'success');
  };

  return (
    <div data-screen-label="06 Playlists">
      <div className="section-head" style={{ marginBottom: 'var(--space-5)' }}>
        <div>
          <div className="eyebrow">Your library · {playlists.length}</div>
          <h1 className="h1" style={{ fontSize: 40, marginTop: 8 }}>Playlists</h1>
        </div>
        <button className="btn btn-primary" onClick={onCreatePlaylist}>
          <Icon name="plus" size={14} /> New playlist
        </button>
      </div>

      {playlists.length === 0 && (
        <div className="glass" style={{ padding: 'var(--space-7)', textAlign: 'center', marginBottom: 'var(--space-5)' }}>
          <div style={{ fontSize: 40 }}>🎵</div>
          <div className="h3" style={{ marginTop: 12 }}>No playlists yet</div>
          <div className="fg-2" style={{ fontSize: 13, marginTop: 6, marginBottom: 20 }}>Create your first playlist to organise tracks you love.</div>
          <button className="btn btn-primary" onClick={onCreatePlaylist}><Icon name="plus" size={14} /> New playlist</button>
        </div>
      )}

      <div className="card-grid" style={{ marginBottom: 'var(--space-7)' }}>
        {playlists.map(p => (
          <div className="track-card glass" key={p.id}>
            <div className="track-cover" style={{ position: 'relative' }}>
              <Art index={p.cover} className="cover-art" />
              <div style={{ position: 'absolute', top: 10, left: 10 }}>
                <span className="pill accent">{p.shared ? 'PUBLIC' : 'PRIVATE'}</span>
              </div>
              <button className="play-overlay" onClick={() => setDetailPlaylist(p)}><Icon name="play" size={16} /></button>
            </div>
            <div className="track-info">
              <div className="h4" style={{ cursor: 'pointer' }} onClick={() => setDetailPlaylist(p)}>{p.name}</div>
              <div className="fg-2 mono" style={{ fontSize: 11 }}>{(p.tracks||[]).length} tracks · {(p.plays||0).toLocaleString()} plays</div>
              <div className="row gap-2" style={{ marginTop: 8 }}>
                <button className="btn btn-glass btn-sm" style={{ flex: 1 }} onClick={() => onShare({ playlist: p })}>
                  <Icon name="share" size={12} /> Share
                </button>
                {/* ⋯ dropdown */}
                <div style={{ position: 'relative' }}>
                  <button className="icon-btn" onClick={() => setMenuPlaylist(menuPlaylist?.id === p.id ? null : p)}>
                    <Icon name="more" size={14} />
                  </button>
                  {menuPlaylist?.id === p.id && (
                    <React.Fragment>
                      <div style={{ position: 'fixed', inset: 0, zIndex: 99 }} onClick={() => setMenuPlaylist(null)} />
                      <div className="glass glass-strong" style={{
                        position: 'absolute', right: 0, top: 'calc(100% + 4px)',
                        zIndex: 100, minWidth: 180, padding: 6,
                        borderRadius: 12, border: '1px solid var(--line)',
                        boxShadow: 'var(--shadow-2)',
                      }}>
                        {[
                          { icon: 'list',     label: 'View tracks',  action: () => { setDetailPlaylist(p); setMenuPlaylist(null); } },
                          { icon: 'download', label: 'Export CSV',   action: () => { exportPlaylist(p, 'csv'); setMenuPlaylist(null); } },
                          { icon: 'download', label: 'Export TXT',   action: () => { exportPlaylist(p, 'txt'); setMenuPlaylist(null); } },
                          { icon: 'share',    label: 'Share',        action: () => { onShare({ playlist: p }); setMenuPlaylist(null); } },
                        ].map(item => (
                          <button key={item.label} onClick={item.action} style={{
                            display: 'flex', width: '100%', alignItems: 'center', gap: 10,
                            padding: '9px 12px', background: 'none', border: 'none',
                            color: 'var(--fg-0)', cursor: 'pointer', borderRadius: 8, fontSize: 13,
                          }}
                            onMouseEnter={e => e.currentTarget.style.background = 'var(--bg-1)'}
                            onMouseLeave={e => e.currentTarget.style.background = 'none'}
                          >
                            <Icon name={item.icon} size={14} />{item.label}
                          </button>
                        ))}
                      </div>
                    </React.Fragment>
                  )}
                </div>
              </div>
            </div>
          </div>
        ))}
      </div>

      {detailPlaylist && (
        <PlaylistDetailModal
          playlist={detailPlaylist}
          onClose={() => setDetailPlaylist(null)}
          onPlay={onPlay}
          onShare={onShare}
        />
      )}
    </div>
  );
}

/* ============================================
   LOGIN / SIGNUP (Auth shell, no sidebar)
   ============================================ */
function AuthScreen({ onLogin, theme, onToggleTheme, onNavigate }) {
  const [tab, setTab] = React.useState('login');
  const [email, setEmail] = React.useState('');
  const [pw, setPw] = React.useState('');
  const [name, setName] = React.useState('');
  const toast = useToast();

  const submit = () => {
    if (!email || !pw) return toast('Fill out all fields', 'info');
    onLogin({
      name: name || 'Maya Chen',
      handle: (name || 'maya').toLowerCase().replace(/\s+/g, '_'),
      email,
      hue: 280,
      joined: 'May 16, 2026',
      role: 'user',
    });
    toast(tab === 'login' ? 'Welcome back!' : 'Account created 🎉', 'success');
  };

  return (
    <div className="auth-shell" data-screen-label="07 Login">
      {onToggleTheme && (
        <button
          className="icon-btn glass"
          onClick={onToggleTheme}
          style={{
            position: 'fixed', top: 'var(--space-5)', right: 'var(--space-5)',
            width: 40, height: 40, zIndex: 10,
          }}
          title="Toggle theme"
        >
          <Icon name={theme === 'dark' ? 'sun' : 'moon'} size={16} />
        </button>
      )}
      <div className="auth-card glass glass-strong">
        <div className="col gap-2" style={{ alignItems: 'center', textAlign: 'center' }}>
          <div className="brand-mark" style={{ width: 56, height: 56, borderRadius: 14 }}>
            <svg width="28" height="28" viewBox="0 0 24 24" fill="currentColor">
              <polygon points="9.2,5.5 22.8,2.8 22.8,6.3 9.2,9"/>
              <rect x="9.2" y="5.5" width="1.8" height="12.5" rx="0.9"/>
              <rect x="21" y="2.8" width="1.8" height="12.7" rx="0.9"/>
              <ellipse cx="7" cy="18" rx="3.5" ry="2.5" transform="rotate(-15 7 18)"/>
              <ellipse cx="19" cy="15.5" rx="3.5" ry="2.5" transform="rotate(-15 19 15.5)"/>
            </svg>
          </div>
          <h1 className="h2" style={{ marginTop: 12 }}>{tab === 'login' ? 'Welcome back' : 'Create an account'}</h1>
          <div className="fg-2" style={{ fontSize: 13 }}>
            {tab === 'login' ? 'Pick up where you left off' : 'Start listening, rating, sharing.'}
          </div>
        </div>

        <div className="auth-tab-row">
          <button className={`auth-tab ${tab === 'login' ? 'active' : ''}`} onClick={() => setTab('login')}>Log in</button>
          <button className={`auth-tab ${tab === 'signup' ? 'active' : ''}`} onClick={() => setTab('signup')}>Sign up</button>
        </div>

        <div className="oauth-row" style={{ gridTemplateColumns: '1fr' }}>
        <button
          className="oauth-btn"
          onClick={async () => {
            try {
              if (!window.firebaseAuthBridge) {
                toast('Google auth is not configured yet', 'error');
                return;
              }
              const fbUser = await window.firebaseAuthBridge.signInWithGoogle();
              const email = fbUser.email || '';
              const name = fbUser.displayName || email.split('@')[0] || 'User';
              const handle = email ? email.split('@')[0].toLowerCase() : 'listener';
              const isHardAdmin = email.toLowerCase() === 'pguleria@gmail.com';
              let role = isHardAdmin ? 'admin' : 'user';
              if (!isHardAdmin && window.firestoreDB && window.firestoreModule?.query) {
                try {
                  const { collection, getDocs, query: fq, where } = window.firestoreModule;
                  const snap = await getDocs(fq(collection(window.firestoreDB, 'users'), where('email', '==', email)));
                  if (!snap.empty && snap.docs[0].data().role === 'co-admin') role = 'co-admin';
                } catch(e) { /* ignore */ }
              }
              onLogin({
                name, email, handle, role,
                hue: isHardAdmin ? 0 : role === 'co-admin' ? 150 : 280,
                joined: new Date().toLocaleDateString('en-US', { month: 'short', year: 'numeric' }),
                avatar: fbUser.photoURL || null,
              });
              toast('Signed in with Google', 'success');
            } catch (err) {
              console.error(err);
              toast('Google sign-in failed', 'error');
            }
          }}
        >
          <svg width="16" height="16" viewBox="0 0 24 24" aria-hidden="true">
            <path fill="#EA4335" d="M12 10.2v3.9h5.4c-.2 1.3-1.5 3.9-5.4 3.9-3.2 0-5.9-2.7-5.9-6s2.7-6 5.9-6c1.8 0 3 .8 3.7 1.5l2.5-2.4C16.6 3.6 14.5 2.7 12 2.7 6.9 2.7 2.8 6.8 2.8 12s4.1 9.3 9.2 9.3c5.3 0 8.8-3.7 8.8-8.9 0-.6-.1-1.1-.2-1.6H12z"/>
          </svg>
          Continue with Google
        </button>
      </div>

        <div className="divider">Or with email</div>

        <div className="col gap-3">
          {tab === 'signup' && (
            <div className="field">
              <label className="field-label">Name</label>
              <input className="input" placeholder="Your name" value={name} onChange={e => setName(e.target.value)} />
            </div>
          )}
          <div className="field">
            <label className="field-label">Email</label>
            <input className="input" type="email" placeholder="you@email.com" value={email} onChange={e => setEmail(e.target.value)} />
          </div>
          <div className="field">
            <label className="field-label">Password</label>
            <input className="input" type="password" placeholder="••••••••" value={pw} onChange={e => setPw(e.target.value)} />
          </div>
          {tab === 'login' && (
            <div className="row" style={{ justifyContent: 'flex-end' }}>
              <button className="btn btn-ghost btn-sm" style={{ fontSize: 12 }}>Forgot password?</button>
            </div>
          )}
        </div>

        <button className="btn btn-primary btn-block btn-lg" onClick={submit}>
          {tab === 'login' ? 'Log in' : 'Create account'} <Icon name="arrow-right" size={14} />
        </button>

        <div className="col gap-2" style={{ alignItems: 'center', textAlign: 'center' }}>
          <div className="fg-3 mono" style={{ fontSize: 10, letterSpacing: '0.08em' }}>
            BY CONTINUING YOU AGREE TO OUR{' '}
            <button onClick={() => onNavigate?.('terms')} style={{ background: 'none', border: 'none', color: 'var(--accent)', cursor: 'pointer', fontSize: 'inherit', fontFamily: 'inherit', letterSpacing: 'inherit', padding: 0, textDecoration: 'underline' }}>TERMS</button>
            {' & '}
            <button onClick={() => onNavigate?.('privacy')} style={{ background: 'none', border: 'none', color: 'var(--accent)', cursor: 'pointer', fontSize: 'inherit', fontFamily: 'inherit', letterSpacing: 'inherit', padding: 0, textDecoration: 'underline' }}>PRIVACY POLICY</button>
          </div>
          <FooterLinks onNavigate={onNavigate} style={{ justifyContent: 'center', marginTop: 4 }} />
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { TrackDetailScreen, ProfileScreen, PlaylistsScreen, AuthScreen, EditProfileModal, formatTime });
