from os import getenv from math import floor from csv import reader from typing import Tuple from dataclasses import dataclass MIN_LEVEL = 1 MAX_LEVEL = 10 PLAYER_PER_COURT = 4 @dataclass class Player: name: str skill: int = 1 status: bool = False @dataclass class Team: player1: str player2: str @dataclass class Game: court: int team1: Team team2: Team @dataclass class CourtList: total: int = int(getenv("COURTS")) def __post_init__(self) -> None: self.courts = {i + 1: True for i in range(self.total)} def get_court_status(self, court_number: int) -> bool: return self.courts[court_number] def toggle_court_status(self, court_number: int) -> None: new_status = not self.courts[court_number] self.courts[court_number] = new_status return new_status def get_courts(self) -> dict: return self.courts def separate_courts(self) -> Tuple[dict, dict]: active_courts = {k: v for k, v in self.courts.items() if v} inactive_courts = {k: v for k, v in self.courts.items() if not v} return active_courts, inactive_courts @dataclass class PlayerList: location: str = getenv("DATABASE") guests: int = 0 def __post_init__(self) -> None: with open("data/" + self.location, newline="") as file: pointer = reader(file) next(pointer, None) players = { id: Player(row[0], int(row[1])) for id, row in enumerate(pointer) } self.guest_id_start = len(players) + 1 self.players = players def increment_guests(self): self.guests = self.guests + 1 return self.guests def decrement_guests(self): if self.guests == 0: return 0 self.guests = self.guests - 1 return self.guests def get_player_status(self, player_number: int) -> bool: return self.players[player_number].status def toggle_player_status(self, player_number: int) -> Tuple[bool, str]: new_status = not self.players[player_number].status self.players[player_number].status = new_status return new_status, self.players[player_number].name def get_players(self) -> dict: return self.players def get_possible_game_count(self) -> int: total_players = len(self.get_potential_players()) possible_games = floor(total_players / PLAYER_PER_COURT) return possible_games def get_potential_players(self) -> dict: players = {k: v for k, v in self.players.items() if v.status} guests = { self.guest_id_start + k: Player(name=f"Guest {k}") for k in range(1, self.guests + 1) } players.update(guests) return players