summaryrefslogtreecommitdiff
path: root/src/match_up/utilities.py
diff options
context:
space:
mode:
authorKaran Jayachandra <mail@karanjayachandra.com>2024-11-15 16:54:29 +0100
committerKaran Jayachandra <mail@karanjayachandra.com>2024-11-15 16:54:29 +0100
commit765fe232ac9fded73387d5cb9ba9b0a07f05b4e4 (patch)
tree80f427f52f46bf258c491d45f3bb1e20b4d36c96 /src/match_up/utilities.py
parent6ca047f36fb688cdb72f0170e0fb3aaf3701ff95 (diff)
Added the history and reset functionality
Diffstat (limited to 'src/match_up/utilities.py')
-rw-r--r--src/match_up/utilities.py136
1 files changed, 129 insertions, 7 deletions
diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py
index 56fb78e..db7c76a 100644
--- a/src/match_up/utilities.py
+++ b/src/match_up/utilities.py
@@ -1,10 +1,17 @@
-from time import time
from typing import Tuple
-from random import shuffle
-
-
-SECS_IN_MIN = 60
-DEFAULT_TIMER = 12.0
+from pandas import read_csv
+from random import shuffle, choice
+from random import randint, getrandbits
+from names import get_first_name, get_last_name
+from match_up.data import (
+ Player,
+ DisplayPlayer,
+ Team,
+ Game,
+ MIN_LEVEL,
+ MAX_LEVEL,
+ PLAYER_PER_COURT,
+)
def _shuffle_two_lists(a: list, b: list) -> Tuple[list, list]:
@@ -20,9 +27,124 @@ def _pick_from_list_after_sorting_other(a: list, b: list[int]) -> list:
return [a[index] for index in indices]
-def sample_list(indices: list, cost: list[int], count: int = None) -> list:
+def sample_list(indices: list, cost: list[int], count=None) -> list:
if count is None:
count = len(indices)
indices, cost = _shuffle_two_lists(indices, cost)
indices = _pick_from_list_after_sorting_other(indices, cost)[:count]
return indices
+
+
+def _create_placeholders(courts: dict, name: str) -> list[Game]:
+ dummy_player = Player(id=-1, first=name)
+ dummy_team = Team(
+ player1=DisplayPlayer(dummy_player), player2=DisplayPlayer(dummy_player)
+ )
+ games = [Game(court, dummy_team, dummy_team) for court in courts]
+ return games
+
+
+def _normalize_skill(level: int, new_max: int) -> int:
+ new_level = round((new_max - 1) * (level / MAX_LEVEL)) + 1
+ return new_level
+
+
+def _select_players(players: list[Player], count: int) -> list[Player]:
+ identifiers = [player.id for player in players]
+ play_count = [int(player.count) for player in players]
+ ids = sample_list(identifiers, play_count, count)
+ selected_players = [player for player in players if player.id in ids]
+ return selected_players
+
+
+def _create_groups_of_four_players(
+ players: list[Player], new_max: int
+) -> list[list[Player]]:
+ identifiers = [player.id for player in players]
+ player_levels = [_normalize_skill(int(player.level), new_max) for player in players]
+ identifiers = sample_list(identifiers, player_levels)
+ court_players = []
+ for i in range(0, len(players), PLAYER_PER_COURT):
+ court_ids = identifiers[i : i + PLAYER_PER_COURT]
+ selected_players = [player for player in players if player.id in court_ids]
+ court_players.append(selected_players)
+ return court_players
+
+
+def _create_games(courts: dict, players: list[Player], levels: int) -> list[Game]:
+ court_players = _create_groups_of_four_players(players, levels)
+ games = []
+ for court, players in zip(courts, court_players):
+ team1 = Team(
+ player1=DisplayPlayer(players[0]), player2=DisplayPlayer(players[3])
+ )
+ team2 = Team(
+ player1=DisplayPlayer(players[1]), player2=DisplayPlayer(players[2])
+ )
+ games.append(Game(court, team1, team2))
+ return games
+
+
+def generate_guest_type(count: int, level: int, description: str):
+ base_id = level * 10000
+ return [
+ Player(
+ id=base_id + i,
+ first=description,
+ last=f"{i + 1}",
+ level=level,
+ status=True,
+ count=choice([0, 1000]),
+ )
+ for i in range(count)
+ ]
+
+
+def generate_guests(guests):
+ beginner_guests = generate_guest_type(guests[1], 1, "Beginner")
+ novice_guests = generate_guest_type(guests[3], 3, "Novice")
+ intermediate_guests = generate_guest_type(guests[5], 3, "Intermediate")
+ return beginner_guests + novice_guests + intermediate_guests
+
+
+def _textualize_guest(level, value) -> str:
+ match level:
+ case 1:
+ text = "Beginners"
+ case 3:
+ text = "Novices"
+ case 5:
+ text = "Intermediates"
+ if value == 1:
+ text = text[:-1]
+ return f"{value} {text}"
+
+
+def _init_database_from_csv(session, csv_location: str) -> None:
+ data = read_csv(csv_location)
+ session.query(Player).delete()
+ for _, entry in data.iterrows():
+ player = Player(
+ id=entry["id"],
+ first=entry["first"],
+ last=entry["last"],
+ level=entry["skill"],
+ status=False,
+ count=0,
+ )
+ session.add(player)
+ session.commit()
+
+
+def _init_random_database(session, player_count: int = 80) -> None:
+ for i in range(player_count):
+ player = Player(
+ id=i,
+ first=get_first_name(),
+ last=get_last_name(),
+ level=randint(MIN_LEVEL, MAX_LEVEL),
+ status=bool(getrandbits(1)),
+ count=0,
+ )
+ session.add(player)
+ session.commit()