from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.db.models import Round _ACTIVE_STATUSES = ("open", "closing", "drawing", "paying_out") async def get_active_round(session: AsyncSession) -> Round | None: """The round currently in progress (in any non-closed state), if any. Rounds never overlap: a new round only opens once the previous one is fully closed (payout confirmed, or no participants to pay out).""" return await session.scalar(select(Round).where(Round.status.in_(_ACTIVE_STATUSES)).order_by(Round.id.desc())) async def open_new_round_if_needed(session: AsyncSession) -> Round: """Returns the active round if one exists (whatever its status), otherwise opens a fresh one. Callers that need to attach a bet must additionally check the returned round's status == "open" — a round in closing/drawing/paying_out isn't accepting new bets, but a new round can't open until it's done.""" active = await get_active_round(session) if active is not None: return active round_ = Round(status="open") session.add(round_) await session.flush() return round_