/* ═══════════════════════════════════════════════════════
   screens-main · Home, Ranking, Partidas, Mensalistas, Users, Profile
═══════════════════════════════════════════════════════ */

/* ── HOME / DASHBOARD ─────────────────────── */
const HomeScreen = () => {
  const s = useStore();
  const openMenu = () => update({ drawerOpen: true });
  const me = s.allUsers.find(u => u.uid === s.userUid) || {};
  const myStats = s.ranking[s.userUid] || { points: 0, partidas: 0, profit: 0, invested: 0 };
  const sortedRanking = Object.keys(s.ranking).map(uid => ({ uid, ...s.ranking[uid] })).sort((a, b) => b.points - a.points);
  const myRank = sortedRanking.findIndex(r => r.uid === s.userUid);
  const top3 = sortedRanking.slice(0, 3);
  const openGame = s.games.find(g => g.status === 'open');
  const myConfirmed = openGame?.confirmedPlayers?.some(p => p.uid === s.userUid);

  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar
        onMenu={openMenu}
        title={s.clubInfo?.name || 'Clube'}
        subtitle={`Olá, ${(me.displayName || me.email || '').split(' ')[0].split('@')[0]}`}
        right={
          <button className="topbar-icon-btn" onClick={() => update({ sheet: 'share-qr' })}>
            <Icon name="qr" size={18}/>
          </button>
        }
      />

      <div className="scroll-region stagger">
        {/* Open game banner */}
        {openGame && (
          <div className="card card-gold" style={{
            padding: 0, marginBottom: 16, overflow: 'hidden', position: 'relative',
            background: 'linear-gradient(135deg, var(--felt) 0%, var(--bg-1) 100%)',
            borderColor: 'var(--gold)', cursor: 'pointer',
          }} onClick={() => update({ currentGame: openGame, gameSubTab: 'confirm' })}>
            <SuitsCorner pos="tr" opacity={0.06}/>
            <div style={{ padding: 18 }}>
              <div className="row" style={{ marginBottom: 10 }}>
                <span className="chip chip-neon" style={{ padding: '4px 10px' }}>
                  <span className="live-dot" style={{ width: 6, height: 6 }}/> EM ABERTO
                </span>
                <span className="spacer"/>
                <span className="tag">{fmtDate(openGame.date).toUpperCase()}{openGame.timeStart ? ' · ' + openGame.timeStart : ''}</span>
              </div>
              <div className="font-editorial" style={{ fontStyle: 'italic', fontSize: 26, color: 'var(--gold-1)', lineHeight: 1.05, marginBottom: 4 }}>
                {openGame.name}
              </div>
              {openGame.location && (
                <div className="row" style={{ color: 'var(--ink-3)', fontSize: 12, gap: 6 }}>
                  <Icon name="pin" size={12}/>
                  <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{openGame.location}</span>
                </div>
              )}

              <div className="row" style={{ marginTop: 14, gap: 0 }}>
                <div className="row" style={{ marginRight: 10 }}>
                  {(openGame.confirmedPlayers || []).slice(0, 5).map((p, i) => (
                    <div key={(p.uid || p.name) + i} style={{ marginLeft: i === 0 ? 0 : -10 }}>
                      <Avatar name={p.name} src={getUserAvatar(p.uid || p.name)} size={28}/>
                    </div>
                  ))}
                  {(openGame.confirmedPlayers || []).length > 5 && (
                    <div className="avatar" style={{
                      width: 28, height: 28, marginLeft: -10,
                      background: 'var(--bg-2)', color: 'var(--ink-2)',
                      fontSize: 10, fontFamily: 'var(--font-mono)',
                    }}>+{(openGame.confirmedPlayers || []).length - 5}</div>
                  )}
                </div>
                <div style={{ flex: 1 }}>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>Confirmados</div>
                  <div className="row" style={{ gap: 6 }}>
                    <span className="font-mono" style={{ color: 'var(--ink)', fontWeight: 700, fontSize: 15 }}>
                      {(openGame.confirmedPlayers || []).length}
                    </span>
                    {openGame.maxPlayers > 0 && <span style={{ color: 'var(--ink-3)', fontSize: 13 }}>/ {openGame.maxPlayers}</span>}
                  </div>
                </div>
              </div>

              {openGame.maxPlayers > 0 && (
                <div style={{ height: 4, background: 'var(--bg-2)', borderRadius: 2, marginTop: 10, overflow: 'hidden' }}>
                  <div style={{
                    width: `${Math.min(100, ((openGame.confirmedPlayers || []).length / openGame.maxPlayers) * 100)}%`,
                    height: '100%',
                    background: 'linear-gradient(90deg, var(--gold), var(--gold-1))',
                    boxShadow: '0 0 12px var(--gold-soft)',
                    transition: 'width 0.6s var(--ease)',
                  }}/>
                </div>
              )}

              <button className={`btn ${myConfirmed ? 'btn-neon' : 'btn-primary'}`}
                      style={{ width: '100%', marginTop: 14 }}>
                {myConfirmed ? <><Icon name="check" size={16}/> Você está confirmado · Ver mesa</>
                             : <><Icon name="cards" size={16}/> Confirmar minha presença</>}
              </button>
            </div>
          </div>
        )}

        {/* My snapshot */}
        <div className="card" style={{ padding: 16, marginBottom: 14, position: 'relative', overflow: 'hidden' }}>
          <div style={{ position: 'absolute', top: -20, right: -20, opacity: 0.05 }}>
            <Icon name="trophy" size={120} style={{ color: 'var(--gold-1)' }}/>
          </div>
          <div className="eyebrow" style={{ marginBottom: 8 }}>Sua posição</div>
          <div className="row" style={{ marginBottom: 14 }}>
            <div>
              <div className="font-display grad-gold" style={{ fontSize: 56, lineHeight: 1, fontWeight: 800 }}>
                {myRank >= 0 ? myRank + 1 : '-'}<span style={{ fontSize: 22, color: 'var(--ink-3)', WebkitTextFillColor: 'var(--ink-3)' }}>º</span>
              </div>
              <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>de {sortedRanking.length} mensalistas</div>
            </div>
          </div>
          <div className="grid-3" style={{ gap: 8, gridTemplateColumns: 'repeat(3, minmax(0, 1fr))' }}>
            <Stat label="Pontos" value={<Ticker value={myStats.points}/>} color="var(--gold-1)"/>
            <Stat label="Lucro" value={<TickerBRL value={myStats.profit}/>} color={myStats.profit >= 0 ? 'var(--neon)' : 'var(--red-1)'}/>
            <Stat label="Partidas" value={<Ticker value={myStats.partidas}/>}/>
          </div>
        </div>

        {/* Podium */}
        {top3.length > 0 && (
          <>
            <div className="section-h">
              <h2>Pódio</h2>
              <button onClick={() => update({ route: 'ranking', drawerOpen: false })}
                      style={{ color: 'var(--gold-1)', fontSize: 12, fontWeight: 600 }}>
                Ver ranking ->
              </button>
            </div>
            <div className="card" style={{ padding: 16, marginBottom: 14 }}>
              <div style={{ display: 'flex', alignItems: 'flex-end', justifyContent: 'space-around', minHeight: 140 }}>
                {top3[1] && <Podium rank={2} entry={top3[1]} height={70}/>}
                {top3[0] && <Podium rank={1} entry={top3[0]} height={100} crown/>}
                {top3[2] && <Podium rank={3} entry={top3[2]} height={50}/>}
              </div>
            </div>
          </>
        )}

        {/* Prize */}
        <div className="card felt-bg" style={{
          padding: 18, marginBottom: 14, position: 'relative', overflow: 'hidden',
          borderColor: 'var(--gold)',
        }}>
          <div style={{ position: 'absolute', right: -10, bottom: -20, opacity: 0.08 }}>
            <Suit kind="diamond" size={120} style={{ color: 'var(--gold-1)' }}/>
          </div>
          <div className="eyebrow" style={{ color: 'var(--gold-1)' }}>Prêmio acumulado</div>
          <div className="font-mono" style={{ fontSize: 30, fontWeight: 700, color: 'var(--gold-1)', marginTop: 4 }}>
            <TickerBRL value={s.accumulatedPrize}/>
          </div>
          <div style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 4 }}>
            {s.prizeSplitFinal}% das retenções -> torneio final
          </div>
        </div>

        {/* Quick actions */}
        <div className="grid-2" style={{ marginBottom: 16 }}>
          <button className="card" onClick={() => update({ route: 'partidas' })} style={{ padding: 16, textAlign: 'left' }}>
            <Icon name="cards" size={22} style={{ color: 'var(--gold-1)', marginBottom: 8 }}/>
            <div style={{ fontWeight: 700, fontSize: 14 }}>Partidas</div>
            <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>{s.games.length} no total</div>
          </button>
          <button className="card" onClick={() => update({ route: 'perfil' })} style={{ padding: 16, textAlign: 'left' }}>
            <Icon name="chart" size={22} style={{ color: 'var(--neon)', marginBottom: 8 }}/>
            <div style={{ fontWeight: 700, fontSize: 14 }}>Minhas stats</div>
            <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>Evolução & ROE</div>
          </button>
        </div>
      </div>
    </div>
  );
};

const Podium = ({ rank, entry, height, crown }) => {
  if (!entry) return null;
  const colors = { 1: 'var(--gold-1)', 2: '#c2c2c2', 3: '#c87030' };
  const name = rankKeyDisplay(entry.uid);
  return (
    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6, flex: 1, maxWidth: 100 }}>
      <div style={{ position: 'relative' }}>
        {rank === 1 && (
          <div style={{ position: 'absolute', top: -22, left: '50%', transform: 'translateX(-50%)', color: 'var(--gold-1)' }}>
            <Icon name="crown" size={22}/>
          </div>
        )}
        <Avatar name={name} src={getUserAvatar(entry.uid)} size={rank === 1 ? 56 : 44} ring={rank === 1}/>
      </div>
      <div style={{ fontSize: 12, fontWeight: 600, color: 'var(--ink)', textAlign: 'center', maxWidth: 84, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
        {name.split(' ')[0]}
      </div>
      <div className="font-mono" style={{ fontSize: 14, fontWeight: 700, color: colors[rank] }}>{entry.points} pts</div>
      <div style={{
        width: '100%', height,
        background: `linear-gradient(180deg, ${colors[rank]}33 0%, transparent 100%)`,
        borderTop: `2px solid ${colors[rank]}`,
        borderRadius: '8px 8px 0 0',
        display: 'flex', alignItems: 'flex-start', justifyContent: 'center',
        paddingTop: 4,
      }}>
        <span className="font-display" style={{ color: colors[rank], fontSize: 22, fontWeight: 800 }}>{rank}</span>
      </div>
    </div>
  );
};

/* ── RANKING ─────────────────────────────── */
const RankingScreen = () => {
  const s = useStore();
  const rankData = s.currentSeasonId === '__all__' ? s.allTimeRanking : s.ranking;
  const sorted = Object.keys(rankData).map(uid => ({ uid, ...rankData[uid] }))
    .sort((a, b) => {
      if (b.points !== a.points) return b.points - a.points;
      const roeA = a.invested > 0 ? a.profit / a.invested * 100 : 0;
      const roeB = b.invested > 0 ? b.profit / b.invested * 100 : 0;
      if (Math.abs(roeB - roeA) > 0.01) return roeB - roeA;
      return (b.invested || 0) - (a.invested || 0);
    });
  const seasonGames = s.currentSeasonId === '__all__'
    ? s.games
    : s.games.filter(g => (g.seasonId || 'default') === (s.currentSeasonId || 'default'));
  const totalP = seasonGames.filter(g => g.status === 'closed').length;
  const activeSeason = s.seasons.find(x => x.id === s.currentSeasonId);
  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar onMenu={() => update({ drawerOpen: true })}
              title="Ranking" subtitle={`${totalP} partida${totalP !== 1 ? 's' : ''} computadas`}
              right={isAdmin() && <button className="topbar-icon-btn" onClick={() => update({ route: 'seasons' })} title="Temporadas"><Icon name="trophy" size={18}/></button>}/>
      <div className="scroll-region">
        <SeasonSelector/>
        {activeSeason && (
          <div style={{ fontSize: 11, color: 'var(--ink-3)', marginBottom: 10 }}>
            📅 {activeSeason.info?.label}
            {activeSeason.info?.startDate && ` · ${activeSeason.info.startDate}`}
            {activeSeason.info?.endDate && ` → ${activeSeason.info.endDate}`}
            {activeSeason.info?.status === 'active' && <span style={{ color:'var(--neon)', marginLeft:6 }}>● Ativa</span>}
          </div>
        )}
        <div className="grid-2" style={{ marginBottom: 14 }}>
          <Stat label="Acumulado" value={<TickerBRL value={s.accumulatedPrize}/>} color="var(--gold-1)" icon="trophy"/>
          <Stat label="Split" value={`${s.prizeSplitRanking}% / ${s.prizeSplitFinal}%`} sub="Jogo · Torneio" icon="chart"/>
        </div>
        {isAdmin() && <RankingSettings/>}
        {sorted.length === 0 ? (
          <div className="card" style={{ padding: 30, textAlign: 'center', color: 'var(--ink-3)' }}>
            <Suit kind="club" size={36} style={{ color: 'var(--ink-3)', opacity: 0.4, marginBottom: 10 }}/>
            <div className="font-editorial" style={{ fontStyle: 'italic', fontSize: 16 }}>
              Nenhuma partida registrada ainda.
            </div>
          </div>
        ) : (
          <div className="col stagger" style={{ gap: 6 }}>
            {sorted.map((p, i) => <RankingRow key={p.uid} entry={p} rank={i + 1}/>)}
          </div>
        )}
        <div className="card" style={{ padding: 14, marginTop: 16 }}>
          <div className="row" style={{ marginBottom: 10 }}>
            <Icon name="trophy" size={14} style={{ color: 'var(--gold-1)' }}/>
            <span className="eyebrow">Pontuação por posição</span>
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 6 }}>
            {PTS.map((p, i) => (
              <div key={i} className="row" style={{
                background: 'var(--bg-2)', borderRadius: 6, padding: '5px 8px',
                justifyContent: 'space-between',
              }}>
                <span style={{ fontSize: 11, color: 'var(--ink-3)' }}>{i + 1}º</span>
                <b className="font-mono" style={{ color: 'var(--gold-1)', fontSize: 12 }}>{p}</b>
              </div>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
};

const RankingRow = ({ entry, rank }) => {
  const me = entry.uid === S.userUid;
  const top3 = rank <= 3;
  const colors = ['var(--gold-1)', '#c2c2c2', '#c87030'];
  const medal = rank <= 3 ? ['🥇', '🥈', '🥉'][rank - 1] : `${rank}º`;
  const roe = entry.invested > 0 ? (entry.profit / entry.invested) * 100 : 0;
  const name = rankKeyDisplay(entry.uid);
  return (
    <div className="card" style={{
      padding: '12px 14px',
      borderColor: me ? 'var(--gold)' : top3 ? 'var(--border-strong)' : 'var(--border)',
      borderLeft: top3 ? `3px solid ${colors[rank - 1]}` : me ? '3px solid var(--gold)' : '1px solid var(--border)',
      background: me ? 'var(--gold-soft)' : 'var(--surface)',
    }}>
      <div className="row">
        <div style={{ width: 30, textAlign: 'center', fontSize: top3 ? 20 : 14, fontWeight: 700, color: colors[rank - 1] || 'var(--ink-3)' }}>
          {medal}
        </div>
        <Avatar name={name} src={getUserAvatar(entry.uid)} size={36} ring={top3} online={isOnline(S.allUsers.find(u => u.uid === entry.uid))}/>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ fontWeight: top3 ? 700 : 500, fontSize: 14, color: 'var(--ink)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
            {name} {me && <span style={{ color: 'var(--gold-1)', fontSize: 11 }}>· você</span>}
          </div>
          <div className="row" style={{ gap: 8, marginTop: 2 }}>
            <span style={{ fontSize: 11, color: roe >= 0 ? 'var(--neon)' : 'var(--red-1)', fontFamily: 'var(--font-mono)' }}>
              {roe >= 0 ? '+' : ''}{Math.round(roe)}% ROE
            </span>
            <span style={{ fontSize: 11, color: 'var(--ink-3)' }}>{entry.partidas} jogos</span>
          </div>
        </div>
        <div style={{ textAlign: 'right' }}>
          <div className="font-mono" style={{ fontSize: top3 ? 22 : 18, fontWeight: 700, color: colors[rank - 1] || 'var(--gold-1)' }}>
            {entry.points}
          </div>
          <div className="tag" style={{ fontSize: 9 }}>pts</div>
        </div>
      </div>
    </div>
  );
};

const RankingSettings = () => {
  const s = useStore();
  const [r, setR] = useState(s.prizeSplitRanking);
  const [f, setF] = useState(s.prizeSplitFinal);
  const [acc, setAcc] = useState(s.accumulatedPrize);
  const [err, setErr] = useState('');
  const saveSplit = () => {
    if (r + f !== 100) { setErr('A soma deve ser 100%'); return; }
    setErr('');
    dbPut(clubPath('/config/prizeSplitRanking.json'), r);
    dbPut(clubPath('/config/prizeSplitFinal.json'), f);
    S.prizeSplitRanking = r; S.prizeSplitFinal = f; notify();
    toast('Distribuição salva');
  };
  const saveAcc = () => {
    dbPut(clubPath('/config/accumulatedPrize.json'), acc);
    S.accumulatedPrize = acc; notify();
    toast('Prêmio atualizado');
  };
  return (
    <div className="card" style={{ padding: 14, marginBottom: 14 }}>
      <div className="eyebrow" style={{ marginBottom: 10 }}>Configurações de Prêmio</div>
      <div className="row" style={{ gap: 6, marginBottom: 8, flexWrap: 'wrap' }}>
        <input type="number" value={r} onChange={e => setR(Number(e.target.value) || 0)} className="input" style={{ width: 60, padding: '6px 8px', textAlign: 'center' }}/>
        <span style={{ fontSize: 12, color: 'var(--ink-3)' }}>% jogo +</span>
        <input type="number" value={f} onChange={e => setF(Number(e.target.value) || 0)} className="input" style={{ width: 60, padding: '6px 8px', textAlign: 'center' }}/>
        <span style={{ fontSize: 12, color: 'var(--ink-3)' }}>% torneio</span>
        <button className="btn btn-primary btn-pill" onClick={saveSplit}>Salvar</button>
      </div>
      <div className="row" style={{ gap: 6, marginBottom: err ? 6 : 0 }}>
        <span style={{ fontSize: 12, color: 'var(--ink-3)', flex: 1 }}>Acumulado (R$)</span>
        <input type="number" value={acc} onChange={e => setAcc(Number(e.target.value) || 0)} className="input" style={{ width: 100, padding: '6px 8px', textAlign: 'center' }}/>
        <button className="btn btn-primary btn-pill" onClick={saveAcc}>Salvar</button>
      </div>
      {err && <div style={{ color: 'var(--red-1)', fontSize: 11 }}>{err}</div>}
    </div>
  );
};

/* ── PARTIDAS LIST ──────────────────────── */
const PartidasScreen = () => {
  const s = useStore();
  const filteredGames = s.currentSeasonId && s.currentSeasonId !== '__all__'
    ? s.games.filter(g => (g.seasonId || 'default') === s.currentSeasonId)
    : s.games;
  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar onMenu={() => update({ drawerOpen: true })}
              title="Partidas"
              subtitle={s.seasons.length > 0 ? (s.seasons.find(x=>x.id===s.currentSeasonId)?.info?.label || 'Todas') : 'Temporada'}
              right={isAdmin() && <button className="topbar-icon-btn" onClick={() => update({ sheet: 'new-game' })}><Icon name="plus" size={18}/></button>}
      />
      <div className="scroll-region stagger">
        <SeasonSelector/>
        {filteredGames.length === 0 ? (
          <div className="card" style={{ padding: 30, textAlign: 'center' }}>
            <Suit kind="club" size={36} style={{ color: 'var(--ink-3)', opacity: 0.4 }}/>
            <div className="font-editorial" style={{ fontStyle: 'italic', fontSize: 16, color: 'var(--ink-3)', marginTop: 10 }}>
              Nenhuma partida nesta temporada.
            </div>
            {isAdmin() && (
              <button className="btn btn-primary" onClick={() => update({ sheet: 'new-game' })} style={{ marginTop: 12 }}>
                <Icon name="plus" size={14}/> Nova partida
              </button>
            )}
          </div>
        ) : filteredGames.map(g => {
          const closed = g.status === 'closed';
          const players = closed ? toArr(g.closedPlayers) : toArr(g.confirmedPlayers);
          const winner = closed && toArr(g.closedPlayers)[0];
          return (
            <div key={g.id} onClick={() => update({ currentGame: g, gameSubTab: closed ? 'result' : (isAdmin() ? 'session' : 'confirm') })} className="card" style={{
              padding: 0, marginBottom: 10,
              borderLeft: closed ? '3px solid var(--border-strong)' : '3px solid var(--neon)',
              cursor: 'pointer', overflow: 'hidden',
            }}>
              <div style={{ padding: '14px 16px' }}>
                <div className="row" style={{ marginBottom: 6 }}>
                  <span className={`chip ${closed ? '' : 'chip-neon'}`} style={{ padding: '3px 10px' }}>
                    {!closed && <span className="live-dot" style={{ width: 6, height: 6 }}/>}
                    {closed ? 'FECHADA' : 'ABERTA'}
                  </span>
                  <span className="spacer"/>
                  <span className="tag">{fmtDate(g.date).toUpperCase()}</span>
                </div>
                <div className="font-editorial" style={{ fontStyle: 'italic', fontSize: 20, color: 'var(--ink)', marginBottom: 6 }}>
                  {g.name}
                </div>
                <div className="row" style={{ gap: 10, fontSize: 12, color: 'var(--ink-3)' }}>
                  {g.timeStart && (<><Icon name="clock" size={12}/>{g.timeStart}</>)}
                  {players.length > 0 && (<><Icon name="users" size={12}/>{players.length} jogadores</>)}
                  {closed && g.prizePool && (
                    <>
                      <span className="spacer"/>
                      <span style={{ color: 'var(--gold-1)', fontWeight: 700, fontFamily: 'var(--font-mono)' }}>
                        {fmtBRL(g.prizePool)}
                      </span>
                    </>
                  )}
                </div>
                {winner && (
                  <div className="row" style={{ marginTop: 8, gap: 8, padding: '8px 10px', background: 'var(--bg-2)', borderRadius: 8 }}>
                    <Icon name="crown" size={14} style={{ color: 'var(--gold-1)' }}/>
                    <Avatar name={winner.name} src={getUserAvatar(nameToRankKey(winner.name))} size={22}/>
                    <span style={{ fontSize: 12, color: 'var(--ink-2)' }}>{getDisplayName(winner.name)}</span>
                    <span className="spacer"/>
                    <span className="font-mono" style={{ fontSize: 12, color: 'var(--neon)' }}>
                      +{fmtBRL(winner.profit || 0)}
                    </span>
                  </div>
                )}
              </div>
              {isAdmin() && (
                <div className="row" style={{ gap: 6, padding: '8px 14px', background: 'rgba(0,0,0,0.15)' }}
                     onClick={e => e.stopPropagation()}>
                  <button className="btn btn-ghost btn-pill" onClick={() => update({ currentGame: g, sheet: 'edit-game', editGame: g })}>
                    <Icon name="edit" size={12}/> Editar
                  </button>
                  <span className="spacer"/>
                  <button className="btn btn-pill" style={{ background: 'var(--red-soft)', color: 'var(--red-1)', border: '1px solid var(--red)' }}
                          onClick={() => { if (confirm(`Excluir "${g.name}"?`)) deleteGame(g.id); }}>
                    <Icon name="trash" size={12}/>
                  </button>
                </div>
              )}
            </div>
          );
        })}
      </div>
      {isAdmin() && s.games.length > 0 && (
        <button onClick={() => update({ sheet: 'new-game' })} className="fab">
          <Icon name="plus" size={26}/>
        </button>
      )}
    </div>
  );
};

/* ── NEW / EDIT GAME SHEET ────────────────── */
const NewGameSheet = () => {
  const s = useStore();
  const editing = s.editGame || null;
  const [historical, setHistorical] = useState(false);
  const [name, setName] = useState(editing?.name || '');
  const [date, setDate] = useState(editing?.date || todayISO());
  const [timeStart, setTimeStart] = useState(editing?.timeStart || '20:00');
  const [timeEnd, setTimeEnd] = useState(editing?.timeEnd || '');
  const [loc, setLoc] = useState(editing?.location || '');
  const [buyin, setBuyin] = useState(editing?.buyinValue || BUYIN_DEFAULT);
  const [ret, setRet] = useState(editing?.retValue || RET_DEFAULT);
  const [maxP, setMaxP] = useState(editing?.maxPlayers || 0);
  const [notes, setNotes] = useState(editing?.notes || '');
  const [busy, setBusy] = useState(false);
  const [err, setErr] = useState('');
  const close = () => update({ sheet: null, editGame: null });
  const save = async () => {
    if (!name.trim()) { setErr('Informe o nome'); return; }
    setBusy(true); setErr('');
    const payload = {
      name: name.trim(), date, timeStart, timeEnd,
      location: loc.trim(), buyinValue: Number(buyin) || BUYIN_DEFAULT, retValue: Number(ret) || RET_DEFAULT,
      maxPlayers: Number(maxP) || 0, notes: notes.trim(),
      status: editing ? editing.status : (historical ? 'closed' : 'open'),
    };
    try {
      if (editing) {
        await patchGame(editing.id, payload);
        toast('Partida atualizada');
      } else {
        await createGame(payload);
      }
      close();
    } catch (e) { setErr(e.message || 'Erro'); }
    setBusy(false);
  };
  return (
    <Sheet onClose={close} eyebrow={editing ? 'Editar' : 'Nova'} title={editing ? 'Editar partida' : 'Nova partida'}>
      <div className="col" style={{ gap: 12 }}>
        {!editing && (
          <div className="row" style={{ background: 'var(--bg-2)', borderRadius: 999, padding: 3, gap: 2 }}>
            <button onClick={() => setHistorical(false)} className="btn-pill" style={{
              flex: 1, padding: '8px 10px', borderRadius: 999,
              background: !historical ? 'var(--gold)' : 'transparent',
              color: !historical ? '#0d0d08' : 'var(--ink-3)', fontWeight: 600, fontSize: 12,
            }}>🃏 Em aberto</button>
            <button onClick={() => setHistorical(true)} className="btn-pill" style={{
              flex: 1, padding: '8px 10px', borderRadius: 999,
              background: historical ? 'var(--gold)' : 'transparent',
              color: historical ? '#0d0d08' : 'var(--ink-3)', fontWeight: 600, fontSize: 12,
            }}>📜 Histórica</button>
          </div>
        )}
        <Labeled label="Nome">
          <input className="input" value={name} onChange={e => setName(e.target.value)} placeholder="Ex: Etapa 7"/>
        </Labeled>
        <div className="grid-2">
          <Labeled label="Data"><input className="input" type="date" value={date} onChange={e => setDate(e.target.value)}/></Labeled>
          <Labeled label="Início"><input className="input" type="time" value={timeStart} onChange={e => setTimeStart(e.target.value)}/></Labeled>
        </div>
        <div className="grid-2">
          <Labeled label="Fim (opc.)"><input className="input" type="time" value={timeEnd} onChange={e => setTimeEnd(e.target.value)}/></Labeled>
          <Labeled label="Máx. jogadores"><input className="input" type="number" min="0" value={maxP} onChange={e => setMaxP(e.target.value)}/></Labeled>
        </div>
        <Labeled label="Local (opcional)">
          <input className="input" value={loc} onChange={e => setLoc(e.target.value)} placeholder="Rua, número..."/>
        </Labeled>
        <div className="grid-2">
          <Labeled label="Buy-in (R$)"><input className="input" type="number" min="1" value={buyin} onChange={e => setBuyin(e.target.value)}/></Labeled>
          <Labeled label="Retenção (R$)"><input className="input" type="number" min="0" value={ret} onChange={e => setRet(e.target.value)}/></Labeled>
        </div>
        <Labeled label="Observações">
          <input className="input" value={notes} onChange={e => setNotes(e.target.value)}/>
        </Labeled>
        {err && <div style={{ color: 'var(--red-1)', fontSize: 12 }}>⚠ {err}</div>}
        <button className="btn btn-primary" onClick={save} disabled={busy} style={{ width: '100%', marginTop: 4 }}>
          {busy ? 'Salvando...' : <><Icon name="check" size={16}/> {editing ? 'Salvar alterações' : 'Criar partida'}</>}
        </button>
      </div>
    </Sheet>
  );
};
const Labeled = ({ label, children }) => (
  <div>
    <div className="eyebrow" style={{ marginBottom: 4 }}>{label}</div>
    {children}
  </div>
);

/* ── MENSALISTAS ──────────────────────── */
const MensalistasScreen = () => {
  const s = useStore();
  const [ym, setYm] = useState(s.mensalMes || currentYM());
  useEffect(() => { if (!s.mensalMes) update({ mensalMes: ym }); }, []);
  const list = (s.mensalistasList || []).slice().sort((a, b) => a.localeCompare(b));
  const isPaid = n => {
    const k = n.replace(/\s/g, '_');
    return !!((s.mensalidades[n] && s.mensalidades[n][ym] && s.mensalidades[n][ym].paid) ||
              (s.mensalidades[k] && s.mensalidades[k][ym] && s.mensalidades[k][ym].paid));
  };
  const paid = list.filter(isPaid);
  const pending = list.filter(n => !isPaid(n));
  const total = paid.length * s.monthlyFee;
  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar onMenu={() => update({ drawerOpen: true })} title="Mensalistas" subtitle="Controle de pagamento"/>
      <div className="scroll-region stagger">
        <div className="card" style={{ padding: 12, marginBottom: 14, display: 'flex', alignItems: 'center' }}>
          <button className="topbar-icon-btn" style={{ background: 'transparent', border: 'none' }} onClick={() => setYm(prevMonth(ym))}>
            <Icon name="back" size={20}/>
          </button>
          <div style={{ flex: 1, textAlign: 'center' }}>
            <div className="font-editorial" style={{ fontStyle: 'italic', fontSize: 20, color: 'var(--ink)' }}>{monthLabel(ym)}</div>
            <div className="tag" style={{ fontSize: 9 }}>{paid.length} de {list.length} pagaram</div>
          </div>
          <button className="topbar-icon-btn" style={{ background: 'transparent', border: 'none', transform: 'scaleX(-1)' }} onClick={() => setYm(nextMonth(ym))}>
            <Icon name="back" size={20}/>
          </button>
        </div>
        <div className="grid-3" style={{ marginBottom: 14 }}>
          <Stat label="Pagos" value={<Ticker value={paid.length}/>} color="var(--neon)" icon="check"/>
          <Stat label="Pendentes" value={<Ticker value={pending.length}/>} color="var(--red-1)" icon="hourglass"/>
          <Stat label="Caixa" value={<TickerBRL value={total}/>} color="var(--gold-1)" icon="wallet"/>
        </div>
        {isAdmin() && <MensSettings/>}
        {pending.length > 0 && (
          <>
            <div className="section-h"><h2>Pendentes</h2><span className="chip chip-red">{pending.length}</span></div>
            <div className="col" style={{ gap: 6, marginBottom: 14 }}>
              {pending.map(n => <MensRow key={n} name={n} paid={false} ym={ym} fee={s.monthlyFee}/>)}
            </div>
          </>
        )}
        {paid.length > 0 && (
          <>
            <div className="section-h"><h2>Pagos</h2><span className="chip chip-neon">{paid.length}</span></div>
            <div className="col" style={{ gap: 6 }}>
              {paid.map(n => <MensRow key={n} name={n} paid={true} ym={ym} fee={s.monthlyFee}/>)}
            </div>
          </>
        )}
        {list.length === 0 && (
          <div className="card" style={{ padding: 24, textAlign: 'center', color: 'var(--ink-3)' }}>
            Nenhum mensalista cadastrado.
          </div>
        )}
      </div>
    </div>
  );
};
const MensRow = ({ name, paid, ym, fee }) => {
  const toggle = () => setMensalidadePaid(name, ym, !paid).then(() => toast(!paid ? 'Marcado como pago' : 'Pagamento removido'));
  return (
    <div className="card" style={{
      padding: '10px 14px', display: 'flex', alignItems: 'center', gap: 12,
      background: paid ? 'var(--neon-soft)' : 'var(--red-soft)',
      borderColor: paid ? 'var(--neon)' : 'var(--red)',
      borderLeft: `3px solid ${paid ? 'var(--neon)' : 'var(--red-1)'}`,
    }}>
      <Avatar name={name} src={getUserAvatar(nameToRankKey(name))} size={34}/>
      <div style={{ flex: 1 }}>
        <div style={{ fontSize: 14, fontWeight: 600, color: 'var(--ink)' }}>{name}</div>
        <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>{paid ? 'Pago' : 'Em aberto'}</div>
      </div>
      {isAdmin() ? (
        paid
          ? <button className="btn-pill btn btn-ghost" onClick={toggle}>✕ Desfazer · {fmtBRL(fee)}</button>
          : <button className="btn-pill btn btn-primary" onClick={toggle}><Icon name="check" size={12}/> {fmtBRL(fee)}</button>
      ) : (
        <span className="chip" style={{ padding: '4px 10px' }}>{fmtBRL(fee)}</span>
      )}
    </div>
  );
};
const MensSettings = () => {
  const s = useStore();
  const [fee, setFee] = useState(s.monthlyFee);
  const [newName, setNewName] = useState('');
  const saveFee = () => {
    dbPut(clubPath('/config/monthlyFee.json'), Number(fee) || 0);
    S.monthlyFee = Number(fee) || 0; notify();
    toast('Taxa atualizada');
  };
  const addMens = () => {
    const n = newName.trim(); if (!n) return;
    if (S.mensalistasList.indexOf(n) > -1) { toast(n + ' já está na lista', 'error'); return; }
    S.mensalistasList.push(n); saveMensalistasList().then(() => { notify(); toast('Adicionado'); });
    setNewName('');
  };
  const removeMens = n => {
    if (!confirm('Remover ' + n + '?')) return;
    S.mensalistasList = S.mensalistasList.filter(x => x !== n);
    saveMensalistasList().then(() => { notify(); toast('Removido'); });
  };
  return (
    <div className="card" style={{ padding: 14, marginBottom: 14 }}>
      <div className="eyebrow" style={{ marginBottom: 8 }}>Admin · Mensalistas</div>
      <div className="row" style={{ gap: 6, marginBottom: 8 }}>
        <span style={{ fontSize: 12, color: 'var(--ink-3)', flex: 1 }}>Taxa mensal (R$)</span>
        <input type="number" value={fee} onChange={e => setFee(e.target.value)} className="input" style={{ width: 80, padding: '6px 8px', textAlign: 'center' }}/>
        <button className="btn btn-primary btn-pill" onClick={saveFee}>Salvar</button>
      </div>
      <div className="row" style={{ gap: 6, marginBottom: 8 }}>
        <input className="input" value={newName} onChange={e => setNewName(e.target.value)} placeholder="Nome do mensalista" onKeyDown={e => e.key === 'Enter' && addMens()}/>
        <button className="btn btn-primary btn-pill" onClick={addMens}><Icon name="plus" size={12}/></button>
      </div>
      <div className="row" style={{ flexWrap: 'wrap', gap: 6 }}>
        {s.mensalistasList.map(n => (
          <span key={n} className="chip" style={{ padding: '3px 4px 3px 8px', gap: 4 }}>
            {n}
            <button onClick={() => removeMens(n)} style={{ color: 'var(--red-1)', display: 'flex' }}><Icon name="close" size={11}/></button>
          </span>
        ))}
      </div>
    </div>
  );
};

/* ── USUARIOS (admin) ───────────────────── */
const UsersScreen = () => {
  const s = useStore();
  const [members, setMembers] = useState([]);

  useEffect(() => {
    // Load members
    dbGet(clubPath('/members.json')).then(m => {
      if (m && typeof m === 'object') setMembers(Object.keys(m).map(uid => ({ uid, ...m[uid] })));
    });
    if (isAdmin()) loadPendingMembers();

    // Refresh presence while screen is open (every 12s)
    const refreshPresence = () => refreshPresenceOnly();
    refreshPresence(); // immediate refresh on open
    const interval = setInterval(refreshPresence, 12000);
    return () => clearInterval(interval);
  }, []);
  const all = [
    ...members.filter(m => m.status === 'active'),
    { uid: s.userUid, status: 'active', isMe: true },
  ];
  const uniqUids = [...new Set(all.map(m => m.uid))];
  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar onMenu={() => update({ drawerOpen: true })} title="Usuários" subtitle="Membros do clube"/>
      <div className="scroll-region stagger">
        {/* Super admin panel */}
        {isSuperAdmin() && <AdminsPanel members={uniqUids}/>}

        {s.pendingMembers.length > 0 && isAdmin() && (
          <>
            <div className="section-h"><h2>Pendentes</h2><span className="chip chip-gold">{s.pendingMembers.length}</span></div>
            <div className="col" style={{ gap: 6, marginBottom: 14 }}>
              {s.pendingMembers.map(m => (
                <div key={m.uid} className="card" style={{ padding: 10, display: 'flex', alignItems: 'center', gap: 10 }}>
                  <Avatar name={m.displayName || m.email} size={32}/>
                  <div style={{ flex: 1 }}>
                    <div style={{ fontSize: 13, fontWeight: 600 }}>{m.displayName || 'Usuário'}</div>
                    <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>{m.email}</div>
                  </div>
                  <button className="btn btn-pill" style={{ background: 'var(--neon-soft)', color: 'var(--neon)', border: '1px solid var(--neon)' }}
                          onClick={() => approveMember(m.uid, m.email, m.displayName || m.email)}>
                    <Icon name="check" size={12}/> Aprovar
                  </button>
                  <button className="btn btn-pill" style={{ background: 'var(--red-soft)', color: 'var(--red-1)', border: '1px solid var(--red)' }}
                          onClick={() => { if (confirm('Recusar?')) rejectMember(m.uid); }}>
                    <Icon name="close" size={12}/>
                  </button>
                </div>
              ))}
            </div>
          </>
        )}
        <div className="section-h">
          <h2>Ativos</h2>
          <div className="row" style={{ gap: 6 }}>
            {(() => { const n = uniqUids.filter(uid => isOnline(s.allUsers.find(x => x.uid === uid))).length; return n > 0 ? <span className="chip chip-neon" style={{ padding: '2px 8px', fontSize: 10 }}>● {n} online</span> : null; })()}
            <span className="chip">{uniqUids.length}</span>
          </div>
        </div>
        <div className="col" style={{ gap: 6 }}>
          {uniqUids.map(uid => {
            const u = s.allUsers.find(x => x.uid === uid) || { uid, displayName: '?' };
            const admin = s.adminUids.indexOf(uid) > -1;
            const superA = getSuperAdminUid() === uid;
            const displayN = u.displayName || '';
            const resolvedDisplay = resolveAlias(displayN); // "DJ Eder" -> "Eder", "Dario Franz" -> "Dario"
            const mens = s.mensalistasList.some(m => {
              if (m === displayN) return true;                         // exact match
              if (nameToRankKey(m) === uid) return true;               // via UID lookup
              if (m === resolvedDisplay) return true;                  // alias: "DJ Eder" -> "Eder" matches "Eder"
              if (resolveAlias(m) === displayN) return true;           // reverse alias
              const uFirst = displayN.split(' ')[0];
              if (uFirst && m === uFirst) return true;                 // "Dario" matches "Dario Franz"
              if (m.split(' ')[0] === displayN) return true;           // full name in list vs short user
              return false;
            });
            return (
              <div key={uid} className="card" style={{ padding: 10, display: 'flex', alignItems: 'center', gap: 10 }}>
                <Avatar name={u.displayName || u.email} src={u.avatar} size={34} online={isOnline(u)}/>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 14, fontWeight: 600, color: 'var(--ink)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
                    {u.displayName || (u.email || '').split('@')[0]}
                  </div>
                  <div className="row" style={{ gap: 6, marginTop: 2 }}>
                    <div style={{ fontSize: 11, color: 'var(--ink-3)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{u.email}</div>
                    <span style={{
                      fontSize: 9, fontWeight: 700, letterSpacing: '0.06em',
                      color: isOnline(u) ? 'var(--neon)' : 'var(--ink-3)',
                      flexShrink: 0,
                    }}>
                      {isOnline(u) ? '● ONLINE' : '○ OFFLINE'}
                    </span>
                  </div>
                </div>
                {uid === s.userUid && <span className="chip chip-gold" style={{ padding: '3px 7px' }}>Você</span>}
                {superA && <span className="chip chip-gold" style={{ padding: '3px 7px' }}>S.Admin</span>}
                {admin && !superA && <span className="chip chip-gold" style={{ padding: '3px 7px' }}>Admin</span>}
                {mens && <span className="chip" style={{ padding: '3px 7px' }}>Mens.</span>}
              </div>
            );
          })}
        </div>
      </div>
    </div>
  );
};

const AdminsPanel = ({ members }) => {
  const s = useStore();
  const [busy, setBusy] = useState(null);
  const superAdminUid = getSuperAdminUid();
  const candidates = members.filter(uid => s.adminUids.indexOf(uid) === -1 && uid !== s.userUid);
  const nonSuperAdmins = s.adminUids.filter(uid => uid !== superAdminUid);
  return (
    <div className="card" style={{ padding: 14, marginBottom: 14, borderColor: 'var(--gold)' }}>
      <div className="row" style={{ marginBottom: 10 }}>
        <Icon name="trophy" size={14} style={{ color: 'var(--gold-1)' }}/>
        <span className="eyebrow" style={{ color: 'var(--gold-1)' }}>Super Admin · Gerenciar admins</span>
      </div>
      {s.adminUids.length > 0 && (
        <div className="col" style={{ gap: 6, marginBottom: 10 }}>
          {s.adminUids.map(uid => {
            const u = s.allUsers.find(x => x.uid === uid) || { uid, displayName: '?' };
            const isSelf = uid === s.userUid;
            const isCreator = superAdminUid === uid;
            return (
              <div key={uid} className="card" style={{ padding: '8px 10px', display: 'flex', alignItems: 'center', gap: 8, background: 'var(--bg-2)' }}>
                <Avatar name={u.displayName || u.email} src={u.avatar} size={28}/>
                <div style={{ flex: 1, fontSize: 13, fontWeight: 600 }}>
                  {u.displayName || (u.email||'').split('@')[0]}
                  {isCreator && <span style={{ color: 'var(--gold-1)', fontSize: 10, marginLeft: 6 }}>· Super admin</span>}
                </div>
                {!isSelf && !isCreator && (
                  <button className="btn btn-pill" disabled={busy === uid}
                    style={{ background: 'var(--red-soft)', color: 'var(--red-1)', border: '1px solid var(--red)', fontSize: 11 }}
                    onClick={async () => { setBusy(uid); await removeAdmin(uid); setBusy(null); }}>
                    {busy === uid ? '...' : 'Remover'}
                  </button>
                )}
              </div>
            );
          })}
        </div>
      )}
      {/* Transfer super admin to existing admin */}
      {nonSuperAdmins.length > 0 && (
        <>
          <div className="eyebrow" style={{ marginBottom: 6, fontSize: 9 }}>Transferir super admin</div>
          <div className="col" style={{ gap: 6, marginBottom: 10 }}>
            {nonSuperAdmins.map(uid => {
              const u = s.allUsers.find(x => x.uid === uid) || { uid, displayName: '?' };
              return (
                <div key={uid} className="card" style={{ padding: '8px 10px', display: 'flex', alignItems: 'center', gap: 8, background: 'var(--bg-2)' }}>
                  <Avatar name={u.displayName || u.email} src={u.avatar} size={28}/>
                  <div style={{ flex: 1, fontSize: 13 }}>{u.displayName || (u.email||'').split('@')[0]}</div>
                  <button className="btn btn-pill" disabled={busy === 'transfer_' + uid}
                    style={{ background: 'var(--gold-soft)', color: 'var(--gold-1)', border: '1px solid var(--gold)', fontSize: 11 }}
                    onClick={async () => { setBusy('transfer_' + uid); await transferSuperAdmin(uid); setBusy(null); }}>
                    {busy === 'transfer_' + uid ? '...' : 'S.Admin'}
                  </button>
                </div>
              );
            })}
          </div>
        </>
      )}
      {candidates.length > 0 && (
        <>
          <div className="eyebrow" style={{ marginBottom: 6, fontSize: 9 }}>Promover a admin</div>
          <div className="col" style={{ gap: 6 }}>
            {candidates.map(uid => {
              const u = s.allUsers.find(x => x.uid === uid) || { uid, displayName: '?' };
              return (
                <div key={uid} className="card" style={{ padding: '8px 10px', display: 'flex', alignItems: 'center', gap: 8, background: 'var(--bg-2)' }}>
                  <Avatar name={u.displayName || u.email} src={u.avatar} size={28}/>
                  <div style={{ flex: 1, fontSize: 13 }}>{u.displayName || (u.email||'').split('@')[0]}</div>
                  <button className="btn btn-pill" disabled={busy === uid}
                    style={{ background: 'var(--neon-soft)', color: 'var(--neon)', border: '1px solid var(--neon)', fontSize: 11 }}
                    onClick={async () => { setBusy(uid); await addAdmin(uid); setBusy(null); }}>
                    {busy === uid ? '...' : 'Tornar admin'}
                  </button>
                </div>
              );
            })}
          </div>
        </>
      )}
    </div>
  );
};

/* ── Season selector pill ─────────────────── */
const SeasonSelector = ({ onChange }) => {
  const s = useStore();
  if (!s.seasons || s.seasons.length === 0) return null;
  return (
    <div className="row" style={{ gap: 6, flexWrap: 'wrap', marginBottom: 14 }}>
      {[{ id: '__all__', info: { label: 'Histórico geral' } }, ...s.seasons].map(season => {
        const isActive = season.id === '__all__'
          ? s.currentSeasonId === '__all__'
          : s.currentSeasonId === season.id;
        return (
          <button key={season.id} onClick={() => { setViewSeason(season.id); onChange?.(); }}
            className="btn btn-pill"
            style={{
              fontSize: 11, padding: '5px 12px',
              background: isActive ? 'var(--gold)' : 'var(--bg-2)',
              color: isActive ? '#0a0a05' : 'var(--ink-3)',
              border: isActive ? '1px solid var(--gold)' : '1px solid var(--border)',
              fontWeight: isActive ? 700 : 400,
            }}>
            {season.info?.label || season.id}
            {season.info?.status === 'active' && season.id !== '__all__' && (
              <span style={{ marginLeft: 4, color: isActive ? '#0a0a05' : 'var(--neon)', fontSize: 9 }}>●</span>
            )}
          </button>
        );
      })}
    </div>
  );
};

/* ── Seasons admin screen ─────────────────── */
const SeasonsScreen = () => {
  const s = useStore();
  const [form, setForm] = useState(null); // null | { id?, label, startDate, endDate, status }
  const [busy, setBusy] = useState(false);
  const empty = { label: '', startDate: '', endDate: '', status: 'active' };

  const save = async () => {
    if (!form.label) { toast('Informe o nome da temporada', 'error'); return; }
    setBusy(true);
    try {
      if (form.id) await updateSeason(form.id, { label: form.label, startDate: form.startDate, endDate: form.endDate, status: form.status });
      else await createSeason({ label: form.label, startDate: form.startDate, endDate: form.endDate, status: form.status });
      setForm(null);
    } catch (e) { toast('Erro: ' + e.message, 'error'); }
    setBusy(false);
  };

  const statusColors = { active: 'var(--neon)', closed: 'var(--ink-3)' };
  const statusLabel = { active: 'Ativa', closed: 'Encerrada' };

  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar back onBack={() => update({ route: 'home' })} title="Temporadas" subtitle="Gerenciar temporadas do clube"/>
      <div className="scroll-region stagger">
        {/* Season list */}
        {s.seasons.length === 0 && (
          <div className="card" style={{ padding: 28, textAlign: 'center', marginBottom: 14 }}>
            <div style={{ fontSize: 32, marginBottom: 8 }}>🏆</div>
            <div style={{ color: 'var(--ink-3)', fontSize: 14 }}>Nenhuma temporada cadastrada.<br/>Crie a primeira abaixo.</div>
          </div>
        )}
        <div className="col" style={{ gap: 10, marginBottom: 16 }}>
          {s.seasons.map(season => (
            <div key={season.id} className="card" style={{
              padding: 14,
              borderLeft: `3px solid ${season.info?.status === 'active' ? 'var(--gold)' : 'var(--border)'}`,
            }}>
              <div className="row">
                <div style={{ flex: 1 }}>
                  <div style={{ fontWeight: 700, fontSize: 15, color: 'var(--ink)' }}>{season.info?.label || season.id}</div>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 3 }}>
                    {season.info?.startDate && <>Início: {season.info.startDate}</>}
                    {season.info?.startDate && season.info?.endDate && ' · '}
                    {season.info?.endDate && <>Fim: {season.info.endDate}</>}
                  </div>
                </div>
                <span style={{
                  fontSize: 10, fontWeight: 700, padding: '3px 8px', borderRadius: 6,
                  background: season.info?.status === 'active' ? 'rgba(0,255,157,0.12)' : 'var(--bg-2)',
                  color: statusColors[season.info?.status] || 'var(--ink-3)',
                }}>
                  {statusLabel[season.info?.status] || season.info?.status}
                </span>
              </div>
              {/* Games count + migrate button */}
              {(() => {
                const cnt = s.games.filter(g => (g.seasonId || 'default') === season.id).length;
                const unassigned = s.games.filter(g => !g.seasonId || g.seasonId === 'default').length;
                return (
                  <div style={{ marginTop: 6 }}>
                    <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>
                      {cnt} partida{cnt !== 1 ? 's' : ''} vinculada{cnt !== 1 ? 's' : ''}
                      {unassigned > 0 && <span style={{ color: 'var(--gold-1)', marginLeft: 8 }}>· {unassigned} sem temporada</span>}
                    </div>
                    {unassigned > 0 && (
                      <button
                        className="btn btn-pill"
                        style={{ marginTop: 8, fontSize: 11, width: '100%', background: 'var(--gold-soft)', color: 'var(--gold-1)', border: '1px solid var(--gold)' }}
                        onClick={async () => {
                          if (!confirm(`Vincular ${unassigned} jogo${unassigned !== 1 ? 's' : ''} sem temporada à "${season.info?.label}"?`)) return;
                          setBusy(true);
                          try {
                            await migrateGamesToSeason(season.id);
                            toast(`${unassigned} jogo${unassigned !== 1 ? 's' : ''} vinculado${unassigned !== 1 ? 's' : ''} ✓`);
                          } catch(e) { toast('Erro: ' + e.message, 'error'); }
                          setBusy(false);
                        }}
                        disabled={busy}>
                        {busy ? 'Migrando...' : `⬆ Vincular ${unassigned} jogo${unassigned !== 1 ? 's' : ''} a esta temporada`}
                      </button>
                    )}
                  </div>
                );
              })()}
              <div className="row" style={{ gap: 8, marginTop: 10 }}>
                <button className="btn btn-pill" onClick={() => setForm({ id: season.id, ...season.info })}
                  style={{ fontSize: 11, flex: 1 }}>
                  <Icon name="edit" size={12}/> Editar
                </button>
                {season.info?.status !== 'active' && (
                  <button className="btn btn-pill" onClick={() => updateSeason(season.id, { status: 'active' })}
                    style={{ fontSize: 11, background: 'var(--neon-soft)', color: 'var(--neon)', border: '1px solid var(--neon)' }}>
                    Ativar
                  </button>
                )}
                <button className="btn btn-pill" onClick={() => deleteSeason(season.id)}
                  style={{ fontSize: 11, background: 'var(--red-soft)', color: 'var(--red-1)', border: '1px solid var(--red)' }}>
                  <Icon name="trash" size={12}/>
                </button>
              </div>
            </div>
          ))}
        </div>

        {/* Add button */}
        {!form && isAdmin() && (
          <button className="btn btn-primary" onClick={() => setForm({ ...empty })} style={{ width: '100%' }}>
            <Icon name="plus" size={14}/> Nova temporada
          </button>
        )}

        {/* Form */}
        {form && (
          <div className="card" style={{ padding: 16, borderColor: 'var(--gold)' }}>
            <div className="eyebrow" style={{ marginBottom: 10, color: 'var(--gold-1)' }}>
              {form.id ? 'Editar temporada' : 'Nova temporada'}
            </div>
            <div className="col" style={{ gap: 8 }}>
              <input className="input" placeholder="Nome (ex: 2026/01)" value={form.label}
                onChange={e => setForm(f => ({ ...f, label: e.target.value }))}/>
              <div className="grid-2" style={{ gap: 8 }}>
                <div>
                  <div className="eyebrow" style={{ marginBottom: 4 }}>Início</div>
                  <input className="input" type="date" value={form.startDate}
                    onChange={e => setForm(f => ({ ...f, startDate: e.target.value }))}/>
                </div>
                <div>
                  <div className="eyebrow" style={{ marginBottom: 4 }}>Fim</div>
                  <input className="input" type="date" value={form.endDate}
                    onChange={e => setForm(f => ({ ...f, endDate: e.target.value }))}/>
                </div>
              </div>
              <div className="row" style={{ gap: 8 }}>
                {['active', 'closed'].map(st => (
                  <button key={st} onClick={() => setForm(f => ({ ...f, status: st }))}
                    className="btn btn-pill"
                    style={{
                      fontSize: 11, flex: 1,
                      background: form.status === st ? (st === 'active' ? 'var(--neon-soft)' : 'var(--bg-2)') : 'var(--bg-2)',
                      color: form.status === st ? (st === 'active' ? 'var(--neon)' : 'var(--ink)') : 'var(--ink-3)',
                      border: form.status === st ? `1px solid ${st === 'active' ? 'var(--neon)' : 'var(--border-strong)'}` : '1px solid var(--border)',
                    }}>
                    {st === 'active' ? '● Ativa' : '○ Encerrada'}
                  </button>
                ))}
              </div>
              <div className="row" style={{ gap: 8, marginTop: 4 }}>
                <button className="btn btn-primary" onClick={save} disabled={busy} style={{ flex: 2 }}>
                  {busy ? 'Salvando...' : 'Salvar'}
                </button>
                <button className="btn btn-ghost" onClick={() => setForm(null)} style={{ flex: 1 }}>
                  Cancelar
                </button>
              </div>
            </div>
          </div>
        )}
      </div>
    </div>
  );
};
const ProfileScreen = () => {
  const s = useStore();
  const me = s.allUsers.find(u => u.uid === s.userUid) || {};
  const [name, setName] = useState(me.displayName || '');
  const [pw, setPw] = useState('');
  const [pw2, setPw2] = useState('');
  const [busy, setBusy] = useState(false);
  const [info, setInfo] = useState('');
  const [err, setErr] = useState('');
  const fileRef = useRef(null);
  const myStats = s.ranking[s.userUid] || { points: 0, partidas: 0, profit: 0, invested: 0 };
  const sorted = Object.keys(s.ranking).map(uid => ({ uid, ...s.ranking[uid] })).sort((a, b) => b.points - a.points);
  const rank = sorted.findIndex(r => r.uid === s.userUid);
  const roe = myStats.invested > 0 ? (myStats.profit / myStats.invested) * 100 : 0;

  // Extended stats from game history
  const history = getMyGameHistory();
  const totalCashout = history.reduce((acc, h) => acc + (h.player.cashout != null ? h.player.cashout : (h.player.profit || 0) + (h.player.invested || 0)), 0);
  const totalInvested = history.reduce((acc, h) => acc + (h.player.invested || (h.player.buyins || 1) * (h.gv.cv)), 0);
  const wins = history.filter(h => h.player.position === 1).length;
  const positions = history.map(h => h.player.position).filter(Boolean);
  const bestPos = positions.length > 0 ? Math.min(...positions) : null;
  const profitGames = history.filter(h => (h.player.profit || 0) > 0).length;
  const avgBuyins = history.length > 0 ? (history.reduce((a, h) => a + (h.player.buyins || 1), 0) / history.length) : 0;
  const profitHistory = history.map(h => h.player.profit || 0);

  const pickPhoto = e => {
    const f = e.target.files?.[0]; if (!f) return;
    if (f.size > 15 * 1024 * 1024) { toast('Imagem muito grande (max 15MB)', 'error'); return; }
    showCropModal(f, async dataUrl => {
      try {
        await updateMyProfile({ avatar: dataUrl });
        toast('Foto atualizada');
      } catch (e) { toast('Erro ao salvar foto', 'error'); }
    });
    e.target.value = '';
  };
  const saveName = async () => {
    setBusy(true); setInfo(''); setErr('');
    try { await updateMyProfile({ displayName: name.trim() }); setInfo('Salvo'); setTimeout(() => setInfo(''), 2000); }
    catch (e) { setErr('Erro ao salvar'); }
    setBusy(false);
  };
  const changePw = async () => {
    if (pw.length < 6) { setErr('Mínimo 6 caracteres'); return; }
    if (pw !== pw2) { setErr('Senhas não coincidem'); return; }
    setBusy(true); setErr('');
    try {
      await fbChangePw(S.token, pw);
      setInfo('Senha alterada'); setPw(''); setPw2(''); setTimeout(() => setInfo(''), 2500);
    } catch (e) { setErr(e.message); }
    setBusy(false);
  };
  const removePhoto = async () => {
    if (!confirm('Remover foto?')) return;
    await updateMyProfile({ avatar: null });
    toast('Foto removida');
  };

  return (
    <div className="page-enter" style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
      <TopBar onMenu={() => update({ drawerOpen: true })} title="Meu perfil" subtitle="Estatísticas & configurações"/>
      <div className="scroll-region stagger">
        {/* Profile card */}
        <div className="card card-gold" style={{
          padding: 20, marginBottom: 14,
          background: 'linear-gradient(160deg, var(--felt) 0%, var(--bg-1) 100%)',
          position: 'relative', overflow: 'hidden',
        }}>
          <SuitsCorner pos="tr" opacity={0.08}/>
          <div className="row" style={{ marginBottom: 14 }}>
            <div style={{ position: 'relative' }}>
              <Avatar name={me.displayName || me.email} src={me.avatar} size={72} ring/>
              <button onClick={() => fileRef.current?.click()} style={{
                position: 'absolute', bottom: -2, right: -2,
                width: 26, height: 26, borderRadius: 13,
                background: 'var(--gold)', color: '#0a0a05',
                display: 'flex', alignItems: 'center', justifyContent: 'center',
                border: '2px solid var(--bg-1)',
              }}><Icon name="camera" size={12}/></button>
              <input ref={fileRef} type="file" accept="image/*" onChange={pickPhoto} style={{ display: 'none' }}/>
            </div>
            <div style={{ flex: 1, marginLeft: 14, minWidth: 0 }}>
              <div className="font-display grad-gold" style={{ fontSize: 18, fontWeight: 800, letterSpacing: '0.05em', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
                {(me.displayName || (me.email || '').split('@')[0]).toUpperCase()}
              </div>
              <div style={{ fontSize: 12, color: 'var(--ink-3)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{me.email}</div>
              <div className="row" style={{ gap: 6, marginTop: 6 }}>
                {isSuperAdmin() && <span className="chip chip-gold" style={{ padding: '3px 8px', fontSize: 10 }}>SUPER ADMIN</span>}
                {!isSuperAdmin() && isAdmin() && <span className="chip chip-gold" style={{ padding: '3px 8px', fontSize: 10 }}>ADMIN</span>}
                {s.mensalistasList.some(m => {
                  if (m === me.displayName) return true;
                  if (nameToRankKey(m) === s.userUid) return true;
                  const meFirst = (me.displayName || '').split(' ')[0];
                  return meFirst && m === meFirst;
                }) && <span className="chip" style={{ padding: '3px 8px', fontSize: 10 }}>Mensalista</span>}
              </div>
            </div>
          </div>

          {/* Top 3 KPIs */}
          <div className="grid-3" style={{ marginBottom: 0 }}>
            <div style={{ textAlign: 'center' }}>
              <div className="font-mono grad-gold" style={{ fontSize: 22, fontWeight: 700 }}>{rank >= 0 ? rank + 1 + 'º' : '-'}</div>
              <div className="tag">Ranking</div>
            </div>
            <div style={{ textAlign: 'center' }}>
              <div className="font-mono" style={{ fontSize: 22, fontWeight: 700, color: 'var(--gold-1)' }}>{myStats.points}</div>
              <div className="tag">Pontos</div>
            </div>
            <div style={{ textAlign: 'center' }}>
              <div className="font-mono" style={{ fontSize: 22, fontWeight: 700, color: roe >= 0 ? 'var(--neon)' : 'var(--red-1)' }}>
                {roe >= 0 ? '+' : ''}{Math.round(roe)}%
              </div>
              <div className="tag">ROE</div>
            </div>
          </div>
        </div>

        {/* Extended stats */}
        {history.length > 0 && (
          <>
            <div className="section-h"><h2>Estatísticas detalhadas</h2></div>

            <div className="grid-2" style={{ marginBottom: 8 }}>
              <Stat label="💰 Lucro total" value={<TickerBRL value={myStats.profit}/>}
                color={myStats.profit >= 0 ? 'var(--neon)' : 'var(--red-1)'}/>
              <Stat label="🏦 Cashout total" value={<TickerBRL value={totalCashout}/>} color="var(--gold-1)"/>
            </div>
            <div className="grid-2" style={{ marginBottom: 8 }}>
              <Stat label="🎯 Total investido" value={<TickerBRL value={totalInvested}/>} color="var(--ink-2)"/>
              <Stat label="🃏 Partidas" value={<Ticker value={history.length}/>} sub={`${wins} vitória${wins !== 1 ? 's' : ''}`}/>
            </div>
            <div className="grid-2" style={{ marginBottom: 8 }}>
              <Stat label="🏆 Melhor colocação" value={bestPos ? bestPos + 'º' : '-'} color="var(--gold-1)"/>
              <Stat label="✅ Partidas c/ lucro" value={history.length > 0 ? Math.round(profitGames / history.length * 100) + '%' : '-'}
                color="var(--neon)" sub={`${profitGames} de ${history.length}`}/>
            </div>
            <div className="grid-2" style={{ marginBottom: 14 }}>
              <Stat label="🔁 Média de buy-ins" value={avgBuyins.toFixed(1) + 'x'} color="var(--ink-2)"/>
              <Stat label="📊 ROE médio" value={(roe >= 0 ? '+' : '') + Math.round(roe) + '%'}
                color={roe >= 0 ? 'var(--neon)' : 'var(--red-1)'}/>
            </div>

            {/* Sparkline do lucro por partida */}
            {profitHistory.length >= 3 && (
              <div className="card" style={{ padding: 14, marginBottom: 14 }}>
                <div className="eyebrow" style={{ marginBottom: 8 }}>Lucro por partida</div>
                <Sparkline data={profitHistory} color={myStats.profit >= 0 ? 'var(--neon)' : 'var(--red-1)'} width={280} height={40}/>
                <div className="row" style={{ marginTop: 8 }}>
                  <span style={{ fontSize: 10, color: 'var(--ink-3)' }}>Última: {history.length > 0 ? (history[history.length-1].player.profit >= 0 ? '+' : '') + fmtBRL(history[history.length-1].player.profit || 0) : '-'}</span>
                  <span className="spacer"/>
                  <span style={{ fontSize: 10, color: 'var(--ink-3)' }}>{history.length} partidas</span>
                </div>
              </div>
            )}
          </>
        )}

        {/* Edit name */}
        <div className="card" style={{ padding: 14, marginBottom: 10 }}>
          <div className="eyebrow" style={{ marginBottom: 6 }}>Nome de exibição</div>
          <input className="input" value={name} onChange={e => setName(e.target.value)}/>
          <button className="btn btn-primary" onClick={saveName} disabled={busy} style={{ width: '100%', marginTop: 10 }}>
            {busy ? 'Salvando...' : 'Salvar nome'}
          </button>
          {me.avatar && (
            <button onClick={removePhoto} style={{ width: '100%', marginTop: 8, color: 'var(--ink-3)', fontSize: 11, textDecoration: 'underline' }}>
              Remover foto
            </button>
          )}
        </div>

        {/* Change pw */}
        <div className="card" style={{ padding: 14, marginBottom: 14 }}>
          <div className="eyebrow" style={{ marginBottom: 6 }}>Alterar senha</div>
          <input className="input" type="password" value={pw} onChange={e => setPw(e.target.value)} placeholder="Nova senha" style={{ marginBottom: 6 }}/>
          <input className="input" type="password" value={pw2} onChange={e => setPw2(e.target.value)} placeholder="Confirmar"/>
          <button className="btn btn-ghost" onClick={changePw} disabled={busy} style={{ width: '100%', marginTop: 10 }}>
            <Icon name="lock" size={14}/> Alterar senha
          </button>
        </div>

        {info && <div style={{ color: 'var(--neon)', fontSize: 12, textAlign: 'center' }}>✓ {info}</div>}
        {err && <div style={{ color: 'var(--red-1)', fontSize: 12, textAlign: 'center' }}>⚠ {err}</div>}
      </div>
    </div>
  );
};

Object.assign(window, {
  HomeScreen, RankingScreen, PartidasScreen, NewGameSheet,
  MensalistasScreen, UsersScreen, AdminsPanel, ProfileScreen, SeasonsScreen,
  SeasonSelector, Podium, RankingRow,
});
