File size: 4,393 Bytes
54d6a92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from load_options import PlayerOption
from stats import get_stats_map, get_scores_map, get_schedule_with_live


POSITION_LABELS = [
    "QB-1",
    "RB-1",
    "RB-2",
    "WR-1",
    "WR-2",
    "TE-1",
    "K-1",
    "DEF-1",
]


def get_roster_html_str(
    week: int, user_map: dict[str, PlayerOption], user_multipliers: dict[int, dict[str, int]]
) -> str:
    players_str = ""
    if week != 5:
        for pos_label in POSITION_LABELS:
            week_pos_label = f"{week}-{pos_label}"
            player = user_map.get(week_pos_label, PlayerOption.empty_player(week=week))
            player_stats = get_stats_map().get(week, {}).get(player.gsis_id, {})
            player_multiplier = user_multipliers.get(week, {}).get(player.gsis_id, 1)
            player_score = get_scores_map().get(week, {}).get(player.gsis_id, 0.0)
            players_str += get_player_html_str(player, player_stats, player_score, player_multiplier)
    roster_str = f"""<div className='user__roster'>
    {players_str}
</div>"""
    return roster_str


def get_player_html_str(
    player_opt: PlayerOption, player_stats: dict[str, float], player_score: float, multiplier: int
) -> str:
    score = round(player_score * float(multiplier), 0)
    if player_opt.week and player_opt.team:
        game_map = get_schedule_with_live().get(player_opt.week, {}).get(player_opt.team, {})
    else:
        game_map = {}
    game_status = game_map.get("status") or " "
    if isinstance((team_score := game_map.get("score")), int):
        game_score = f"""{team_score} - {game_map.get("opponent_score")}"""
    else:
        game_score = " "
    player_stats_str = get_player_stats_html_str(player_stats)

    player_classes = "player"
    if player_opt.gsis_id:
        player_classes += f" player--{player_opt.gsis_id}"

    if player_opt.team:
        player_classes += f" player--{player_opt.team.upper()}"

    image_classes = "player__image"
    multiplier_classes = "player__multiplier"
    if multiplier > 1:
        image_classes += f" player__image--{multiplier}"
        multiplier_classes += f" player__multiplier--{multiplier}"

    if not (player_image_url := player_opt.headshot_url):
        player_image_url = "https://static.www.nfl.com/w_114,h_80,c_fill/league/suxzfdslsj5vpwbin5t8"
        player_classes += " player--hidden"

    player_str = f"""<div className='{player_classes}'>
			<div className="player__position">{player_opt.position}</div>
			<div className={image_classes}>
				<img className="player__img" src={player_image_url} alt='{player_opt.full_name}' />
			</div>
			<div className="player__name">{player_opt.full_name}</div>
			<div className="player__team">{player_opt.team}</div>
			<span className="player__score">{score: .0f}</span>
			<span className='{multiplier_classes}'>{multiplier}X</span>
			<span className="player__game-status">{game_status}</span>
			<span className="player__game-score">{game_score}</span>
			{player_stats_str}
		</div>"""

    return player_str


def get_stat_list_item_html_str(stat_key: str, stat_value: str | float) -> str:
    return f"""<div className="stat">
			<div className="stat__key">{stat_key}</div>
			<div className="stat__value">{stat_value:.0f}</div>
		</div>"""


def get_player_stats_html_str(stats_dict: dict[str, float]) -> str:
    sorted_stat_tuple = list(
        filter(lambda x: x[1] != 0, sorted(list(stats_dict.items()), key=lambda x: x[1], reverse=True))
    )
    max_stats = 4
    stat_items_str = "\n".join([get_stat_list_item_html_str(s, v) for s, v in sorted_stat_tuple[:max_stats]])

    stats_str = f"""<div className="player-stats">{stat_items_str}</div>"""
    return stats_str


def get_user_html_str(
    week: int,
    user_name: str,
    user_map: dict[str, PlayerOption],
    week_score: float,
    place: int,
    user_multipliers: dict[int, dict[str, int]],
) -> str:
    user_str = ""
    score_type = "Score"
    roster_html_str = get_roster_html_str(week, user_map, user_multipliers)
    user_str += f"""
    <div className="user">
        <span className="user__place">{place}</span>
        <span className="user__username">{user_name}</span>
        <span className="user__username">{user_name}</span>
        <span className="user__score-type">{score_type}</span>
        <span className="user__score-number">{week_score: .0f}</span>
        {roster_html_str}
    </div>"""
    return user_str