diff --git a/helpers/glory_helpers.py b/helpers/glory_helpers.py new file mode 100644 index 0000000..6e19656 --- /dev/null +++ b/helpers/glory_helpers.py @@ -0,0 +1,152 @@ +from typing import List, Dict, Optional, Union, Any +from sqlalchemy.orm import Session +from datetime import datetime + +def calculate_goal_difference(goals_for: int, goals_against: int) -> int: + """ + Calculate goal difference for a team. + + Args: + goals_for: Goals scored by team + goals_against: Goals conceded by team + + Returns: + int: Goal difference + """ + return goals_for - goals_against + +def update_team_stats( + team: Any, + match_result: str, + goals_scored: int, + goals_conceded: int +) -> None: + """ + Update team statistics after a match. + + Args: + team: Team object to update + match_result: Result of match ('W', 'D', 'L') + goals_scored: Goals scored in match + goals_conceded: Goals conceded in match + """ + team.matches_played += 1 + team.goals_for += goals_scored + team.goals_against += goals_conceded + team.goal_difference = calculate_goal_difference(team.goals_for, team.goals_against) + + if match_result == 'W': + team.wins += 1 + team.points += 3 + elif match_result == 'D': + team.draws += 1 + team.points += 1 + else: + team.losses += 1 + +def get_team_standings(db: Session, season: str, league: str) -> List[Dict]: + """ + Get sorted team standings for a league season. + + Args: + db: Database session + season: Season to get standings for + league: League to get standings for + + Returns: + List of teams sorted by points and goal difference + """ + teams = db.query(Glory).filter( + Glory.season == season, + Glory.league == league, + Glory.is_active == True + ).all() + + sorted_teams = sorted( + teams, + key=lambda x: (-x.points, -x.goal_difference, -x.goals_for) + ) + + standings = [] + for position, team in enumerate(sorted_teams, 1): + team.position = position + standings.append({ + "position": position, + "team_name": team.team_name, + "points": team.points, + "matches_played": team.matches_played, + "wins": team.wins, + "draws": team.draws, + "losses": team.losses, + "goals_for": team.goals_for, + "goals_against": team.goals_against, + "goal_difference": team.goal_difference + }) + + return standings + +def validate_team_data(team_data: Dict[str, Any]) -> Dict[str, str]: + """ + Validate team data before creation/update. + + Args: + team_data: Dictionary containing team data + + Returns: + Dict containing error messages if validation fails + """ + errors = {} + + if not team_data.get("team_name"): + errors["team_name"] = "Team name is required" + + if not team_data.get("league"): + errors["league"] = "League is required" + + if not team_data.get("season"): + errors["season"] = "Season is required" + + if team_data.get("matches_played", 0) < 0: + errors["matches_played"] = "Matches played cannot be negative" + + return errors + +def get_team_form(db: Session, team_name: str, last_n: int = 5) -> str: + """ + Get team's form for last N matches. + + Args: + db: Database session + team_name: Name of team + last_n: Number of recent matches to consider + + Returns: + String representing form (e.g. 'WWDLL') + """ + team = db.query(Glory).filter( + Glory.team_name == team_name, + Glory.is_active == True + ).first() + + if not team: + return "" + + form = "" + total_matches = team.wins + team.draws + team.losses + + if total_matches < last_n: + last_n = total_matches + + # This is simplified - in real app would need to query actual match results + for _ in range(last_n): + if team.wins > 0: + form += "W" + team.wins -= 1 + elif team.draws > 0: + form += "D" + team.draws -= 1 + elif team.losses > 0: + form += "L" + team.losses -= 1 + + return form[::-1] \ No newline at end of file