diff options
Diffstat (limited to 'src/match_up/utilities.py')
| -rw-r--r-- | src/match_up/utilities.py | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py new file mode 100644 index 0000000..db7c76a --- /dev/null +++ b/src/match_up/utilities.py @@ -0,0 +1,150 @@ +from typing import Tuple +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]: + indices = list(range(len(a))) + shuffle(indices) + a = [a[index] for index in indices] + b = [b[index] for index in indices] + return a, b + + +def _pick_from_list_after_sorting_other(a: list, b: list[int]) -> list: + indices = [i[0] for i in sorted(enumerate(b), key=lambda x: x[1])] + return [a[index] for index in indices] + + +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() |
