// ============================================
// ONLINE LOBBY — rooms list with streaks + bets
// ============================================

function OnlineLobby({ navigate }) {
    const { GAME_MODES, TABLES, REGION_NAMES } = window.MastershotData;
    const [filter, setFilter] = React.useState("all");
    const [region, setRegion] = React.useState("all");
    const [currency, setCurrency] = React.useState("all");
    const [search, setSearch] = React.useState("");
    const [rooms, setRooms] = React.useState([]);
    const [loading, setLoading] = React.useState(true);
    const [error, setError] = React.useState(null);
    const [supabaseOn, setSupabaseOn] = React.useState(false);

    // Carrega lobby + subscribe realtime
    React.useEffect(() => {
        const Lobby = window.MastershotLobby;
        if (!Lobby) {
            // Lobby ESM ainda não montou — espera evento e re-renderiza
            const onReady = () => setSupabaseOn(prev => !prev);
            window.addEventListener("mastershot:lobby-ready", onReady, { once: true });
            return () => window.removeEventListener("mastershot:lobby-ready", onReady);
        }
        setSupabaseOn(Lobby.isSupabaseConfigured());

        let mounted = true;
        Lobby.listOpenRooms()
            .then(list => { if (mounted) { setRooms(list); setLoading(false); } })
            .catch(err => { if (mounted) { setError(err.message); setLoading(false); } });

        const unsub = Lobby.subscribeToRooms(({ event, room }) => {
            setRooms(prev => {
                if (event === "DELETE") return prev.filter(r => r.id !== room.id);
                if (event === "INSERT") {
                    if (room.status !== "open") return prev;
                    return [room, ...prev.filter(r => r.id !== room.id)];
                }
                if (event === "UPDATE") {
                    if (room.status === "cancelled" || room.status === "ended") {
                        return prev.filter(r => r.id !== room.id);
                    }
                    return prev.map(r => r.id === room.id ? { ...r, ...room } : r);
                }
                return prev;
            });
        });
        return () => { mounted = false; unsub(); };
    }, []);

    // Normaliza schema do DB (snake_case) pro shape esperado pela RoomRow.
    const filtered = rooms
        .map(r => ({
            ...r,
            // aliases compat com o componente legado
            name:    r.name    || r.host_nick + "'s Room",
            host:    r.host    || r.host_nick,
            avatar:  r.avatar  || r.host_avatar || (r.host_nick || "?").slice(0, 2).toUpperCase(),
            level:   r.level   || 1,
            table:   r.table   || r.table_id,
            streak:  r.streak  || 0,
            ping:    r.ping    || 35,
            players: r.players || "1/2",
            chips:   r.chips   || false,
        }))
        .filter(r => {
            if (filter !== "all" && r.mode !== filter) return false;
            if (region !== "all" && r.region !== region && r.region !== "ALL") return false;
            if (currency === "coins" && r.chips) return false;
            if (currency === "chips" && !r.chips) return false;
            if (search && !r.name.toLowerCase().includes(search.toLowerCase()) && !r.host.toLowerCase().includes(search.toLowerCase())) return false;
            return true;
        });

    return (
        <div className="screen active" style={{ opacity: 1 }}>
            <AmbientBackdrop/>
            <Particles count={10}/>
            <TopBar navigate={navigate}/>

            <div style={{ position: "absolute", top: 88, left: 48, zIndex: 20 }}>
                <button className="back-btn" onClick={() => navigate("menu")}>
                    <span dangerouslySetInnerHTML={{ __html: window.Icon.back(14) }}/>
                    <span>Menu</span>
                </button>
            </div>

            <div style={{
                position: "relative", zIndex: 5,
                paddingTop: 120, paddingBottom: 40, paddingLeft: 48, paddingRight: 48,
                maxWidth: 1480, margin: "0 auto",
                height: "100%",
                display: "flex", flexDirection: "column",
            }}>
                {/* Header */}
                <div style={{ display: "flex", alignItems: "flex-end", justifyContent: "space-between", marginBottom: 24, gap: 20 }}>
                    <div>
                        <div style={{ fontSize: 12, color: "var(--gold-500)", letterSpacing: "0.24em", textTransform: "uppercase", marginBottom: 6 }}>
                            Modo Online
                        </div>
                        <div style={{ fontFamily: "var(--font-display)", fontSize: 36, color: "var(--ink-100)", letterSpacing: "0.03em", fontWeight: 600 }}>
                            Salões Ativos
                        </div>
                    </div>
                    <div style={{ display: "flex", gap: 12 }}>
                        <button className="btn-ghost" onClick={() => navigate("waiting")}>
                            <span dangerouslySetInnerHTML={{ __html: window.Icon.zap(14) }}/>
                            <span style={{ marginLeft: 8 }}>Partida Rápida</span>
                        </button>
                        <button className="btn" onClick={() => navigate("createRoom")}>
                            <span dangerouslySetInnerHTML={{ __html: window.Icon.plus(16) }}/>
                            <span>Criar Sala</span>
                        </button>
                    </div>
                </div>

                {/* Filter bar */}
                <div style={{
                    display: "flex", gap: 12, alignItems: "center",
                    padding: "14px 18px",
                    background: "var(--g-panel)",
                    border: "1px solid var(--ink-700)",
                    borderRadius: "var(--r-md)",
                    marginBottom: 16,
                }}>
                    <div style={{ position: "relative", flex: 1, maxWidth: 320 }}>
                        <div style={{ position: "absolute", left: 12, top: "50%", transform: "translateY(-50%)", color: "var(--ink-400)", pointerEvents: "none" }}
                            dangerouslySetInnerHTML={{ __html: window.Icon.search(14) }}/>
                        <input className="input" placeholder="Buscar sala ou jogador..." value={search} onChange={e => setSearch(e.target.value)}
                            style={{ paddingLeft: 36, height: 38, background: "var(--ink-950)" }}/>
                    </div>
                    <div style={{ width: 1, height: 24, background: "var(--ink-700)" }}/>
                    <FilterSelect label="Modo" value={filter} onChange={setFilter} options={[["all","Todos"],...GAME_MODES.map(m=>[m.id,m.name])]}/>
                    <FilterSelect label="Região" value={region} onChange={setRegion} options={[["all","Todas"],["SA","América do Sul"],["NA","América do Norte"],["EU","Europa"],["AS","Ásia"]]}/>
                    <FilterSelect label="Aposta" value={currency} onChange={setCurrency} options={[["all","Todas"],["coins","Moedas"],["chips","Fichas Premium"]]}/>
                    <div style={{ marginLeft: "auto", fontSize: 12, color: "var(--ink-300)" }}>
                        <span style={{ color: "var(--gold-300)", fontWeight: 600 }}>{filtered.length}</span> salas · <span style={{ color: "var(--win-bright)" }}>●</span> 28.451 online
                    </div>
                </div>

                {/* Table header */}
                <div className="room-row room-head">
                    <div>Sala</div>
                    <div>Modo</div>
                    <div>Mesa</div>
                    <div>Host</div>
                    <div style={{ textAlign: "center" }}>Streak</div>
                    <div style={{ textAlign: "right" }}>Aposta</div>
                    <div style={{ textAlign: "center" }}>Ping</div>
                    <div style={{ textAlign: "center" }}>Vagas</div>
                    <div/>
                </div>

                {/* Rooms list */}
                <div style={{ flex: 1, overflowY: "auto", display: "flex", flexDirection: "column", gap: 6, paddingRight: 8 }}>
                    {loading && (
                        <div style={{ padding: 60, textAlign: "center", color: "var(--ink-400)" }}>
                            Carregando salas…
                        </div>
                    )}
                    {!loading && error && (
                        <div style={{ padding: 60, textAlign: "center", color: "var(--loss-bright)" }}>
                            Erro: {error}
                        </div>
                    )}
                    {!loading && !error && filtered.map((r, i) => (
                        <RoomRow key={r.id} room={r} index={i} navigate={navigate}/>
                    ))}
                    {!loading && !error && filtered.length === 0 && (
                        <div style={{ padding: 60, textAlign: "center", color: "var(--ink-400)" }}>
                            {supabaseOn
                                ? "Nenhuma sala aberta no momento — clique em \"Criar Sala\" pra começar."
                                : "Modo online indisponível (Supabase não configurado). Mostrando salas de exemplo."}
                        </div>
                    )}
                </div>
            </div>

            <style>{`
                .room-row {
                    display: grid;
                    grid-template-columns: 2.2fr 1.2fr 1.4fr 1.3fr 90px 140px 80px 80px 120px;
                    gap: 14px;
                    align-items: center;
                    padding: 14px 18px;
                    background: var(--g-panel);
                    border: 1px solid var(--ink-700);
                    border-radius: var(--r-md);
                    transition: all var(--t-fast);
                    animation: room-in 0.4s var(--ease-out) both;
                    font-size: 13px;
                }
                .room-row:hover:not(.room-head) {
                    border-color: var(--gold-700);
                    background: linear-gradient(180deg, var(--ink-700), var(--ink-850));
                    transform: translateX(2px);
                }
                .room-head {
                    padding: 10px 18px;
                    background: transparent;
                    border: none;
                    font-size: 11px;
                    font-weight: 600;
                    letter-spacing: 0.14em;
                    text-transform: uppercase;
                    color: var(--ink-400);
                    animation: none;
                }
                .room-head:hover { background: transparent; transform: none; }
                @keyframes room-in {
                    from { opacity: 0; transform: translateY(8px); }
                    to { opacity: 1; transform: translateY(0); }
                }
            `}</style>
        </div>
    );
}

function RoomRow({ room, index, navigate }) {
    const { GAME_MODES, TABLES } = window.MastershotData;
    const mode = GAME_MODES.find(m => m.id === room.mode);
    const table = TABLES.find(t => t.id === room.table);
    const statusColor = {
        open: "var(--win-bright)",
        playing: "var(--fire-bright)",
        locked: "var(--ink-400)",
        tourney: "var(--gold-400)",
    }[room.status];
    const statusLabel = {
        open: "Aberta",
        playing: "Em jogo",
        locked: "Privada",
        tourney: "Torneio",
    }[room.status];

    return (
        <div className="room-row" style={{ animationDelay: `${index * 0.03}s` }}>
            {/* Sala */}
            <div style={{ display: "flex", alignItems: "center", gap: 10, minWidth: 0 }}>
                <div style={{
                    width: 8, height: 8, borderRadius: "50%",
                    background: statusColor,
                    boxShadow: `0 0 8px ${statusColor}`,
                    flexShrink: 0,
                }}/>
                <div style={{ minWidth: 0 }}>
                    <div style={{ fontSize: 14, fontWeight: 600, color: "var(--ink-100)", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>
                        {room.name}
                        {room.status === "locked" && <span style={{ marginLeft: 6, color: "var(--ink-400)", verticalAlign: "middle", display: "inline-flex" }}
                            dangerouslySetInnerHTML={{ __html: window.Icon.lock(11) }}/>}
                    </div>
                    <div style={{ fontSize: 11, color: "var(--ink-400)", letterSpacing: "0.08em" }}>{statusLabel} · {room.region}</div>
                </div>
            </div>

            {/* Modo */}
            <div>
                <div style={{ fontSize: 13, fontWeight: 500, color: "var(--ink-100)" }}>{mode.name}</div>
                <div style={{ fontSize: 10, color: "var(--gold-500)", letterSpacing: "0.12em", textTransform: "uppercase" }}>{mode.tag}</div>
            </div>

            {/* Mesa */}
            <div style={{ display: "flex", alignItems: "center", gap: 8, minWidth: 0 }}>
                <div style={{
                    width: 26, height: 18,
                    borderRadius: 3,
                    border: "1px solid rgba(0,0,0,0.5)",
                    background: `radial-gradient(ellipse, ${table.felt}, ${shade(table.felt,-0.3)})`,
                    boxShadow: "inset 0 0 4px rgba(0,0,0,0.4)",
                    flexShrink: 0,
                }}/>
                <div style={{ fontSize: 12, color: "var(--ink-200)", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>
                    {table.name}
                </div>
            </div>

            {/* Host */}
            <div style={{ display: "flex", alignItems: "center", gap: 8, minWidth: 0 }}>
                <Avatar initials={room.avatar} size="sm"/>
                <div style={{ minWidth: 0 }}>
                    <div style={{ fontSize: 13, color: "var(--ink-100)", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>{room.host}</div>
                    <div style={{ fontSize: 11, color: "var(--ink-400)" }}>Nv. {room.level}</div>
                </div>
            </div>

            {/* Streak */}
            <div style={{ display: "flex", justifyContent: "center" }}>
                <StreakBadge count={room.streak}/>
            </div>

            {/* Aposta */}
            <div style={{ textAlign: "right" }}>
                <Currency type={room.chips ? "chip" : "coin"} amount={room.bet} size="sm"/>
            </div>

            {/* Ping */}
            <div style={{ textAlign: "center" }}>
                <div style={{ display: "inline-flex", alignItems: "center", gap: 4, color: room.ping < 40 ? "var(--win-bright)" : room.ping < 70 ? "var(--fire-bright)" : "var(--loss-bright)", fontFamily: "var(--font-mono)", fontSize: 12 }}>
                    <svg width="10" height="10" viewBox="0 0 10 10"><rect x="0" y="6" width="2" height="4" fill="currentColor"/><rect x="3" y="3" width="2" height="7" fill="currentColor" opacity={room.ping<70?1:0.3}/><rect x="6" y="0" width="2" height="10" fill="currentColor" opacity={room.ping<40?1:0.3}/></svg>
                    {room.ping}ms
                </div>
            </div>

            {/* Vagas */}
            <div style={{ textAlign: "center", fontSize: 12, color: "var(--ink-200)", fontFamily: "var(--font-mono)" }}>
                {room.players}
            </div>

            {/* Join */}
            <div style={{ display: "flex", justifyContent: "flex-end", gap: 6 }}>
                {room.status === "playing" ? (
                    <button className="btn-ghost" style={{ padding: "8px 14px", fontSize: 11 }}
                        onClick={() => navigate("waiting", { roomId: room.id, spectate: true })}>
                        Assistir
                    </button>
                ) : room.status === "locked" ? (
                    <button className="btn-ghost" style={{ padding: "8px 14px", fontSize: 11 }}>Senha</button>
                ) : (
                    <button className="btn" style={{ padding: "8px 16px", fontSize: 11 }}
                        onClick={async () => {
                            const Lobby = window.MastershotLobby;
                            if (!Lobby) return navigate("waiting", { roomId: room.id });
                            try {
                                await Lobby.joinRoom(room.id);
                                navigate("waiting", { roomId: room.id });
                            } catch (err) {
                                alert("Não foi possível entrar: " + err.message);
                            }
                        }}>
                        Entrar
                    </button>
                )}
            </div>
        </div>
    );
}

function FilterSelect({ label, value, onChange, options }) {
    return (
        <div style={{ display: "flex", alignItems: "center", gap: 6 }}>
            <span style={{ fontSize: 11, color: "var(--ink-400)", letterSpacing: "0.1em", textTransform: "uppercase" }}>{label}:</span>
            <select className="select" value={value} onChange={e => onChange(e.target.value)}
                style={{ padding: "6px 28px 6px 10px", fontSize: 12, height: 30, width: "auto", background: "var(--ink-950)" }}>
                {options.map(([v,l]) => <option key={v} value={v}>{l}</option>)}
            </select>
        </div>
    );
}

Object.assign(window, { OnlineLobby, RoomRow });
