aboutsummaryrefslogtreecommitdiff
path: root/src/match_up/model.py
diff options
context:
space:
mode:
authorKaran Jayachandra <mail@karanjayachandra.com>2024-11-09 18:19:48 +0000
committerKaran Jayachandra <mail@karanjayachandra.com>2024-11-09 18:19:48 +0000
commit1a7ae4bc2b759de7a03e6ad83632e6ad678754c8 (patch)
tree5b771e755f3a55c6794c649431de35798242a2e0 /src/match_up/model.py
parent2b18e0929a0b3e083cbe9e5e8ffd421ed8d17e52 (diff)
parent75a3ef7d14fcaedab29da46ba3dc5cf9c1bab699 (diff)
Merge branch 'feature/package' into 'develop'
Implemented packaging and command line arguments See merge request KaranJayachandra/match_up!10
Diffstat (limited to 'src/match_up/model.py')
-rw-r--r--src/match_up/model.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/match_up/model.py b/src/match_up/model.py
new file mode 100644
index 0000000..5d6c0f5
--- /dev/null
+++ b/src/match_up/model.py
@@ -0,0 +1,123 @@
+from math import floor
+from csv import reader
+from typing import Tuple
+from names import get_full_name
+from dataclasses import dataclass
+from random import randint, getrandbits
+
+MIN_LEVEL = 1
+MAX_LEVEL = 10
+DEFAULT_COURTS = 12
+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 = DEFAULT_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
+
+
+def _load_csv_players(file_name: str) -> dict:
+ with open(file_name, newline="") as file:
+ pointer = reader(file)
+ next(pointer, None)
+ players = {id: Player(row[0], int(row[1])) for id, row in enumerate(pointer)}
+ return players
+
+
+def _generate_random_players(player_count: int = 80) -> list[Player]:
+ players = {
+ i: Player(
+ name=get_full_name(),
+ skill=randint(MIN_LEVEL, MAX_LEVEL),
+ status=bool(getrandbits(1)),
+ )
+ for i in range(player_count)
+ }
+ return players
+
+
+@dataclass
+class PlayerList:
+ location: str = None
+ guests: int = 0
+
+ def __post_init__(self) -> None:
+ if self.location is not None:
+ self.players = _load_csv_players(self.location)
+ else:
+ self.players = _generate_random_players()
+ self.guest_id_start = len(self.players) + 1
+
+ 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