import asyncio from collections import defaultdict from db_calls import db_get async def rank_pitching_staffs(cardset_id: int = 27): """Rank teams by pitching staff quality based on player rarity.""" print(f'Fetching players from cardset {cardset_id}...\n') # Fetch all players from the cardset p_query = await db_get( 'players', params=[('cardset_id', cardset_id), ('inc_dex', False)] ) if not p_query or p_query['count'] == 0: print(f'No players found for cardset {cardset_id}') return players = p_query['players'] print(f'Found {len(players)} players\n') # Assign point values to each rarity rarity_points = { 'Hall of Fame': 5, 'MVP': 4, 'All-Star': 3, 'Starter': 2, 'Reserve': 1, 'Replacement': 0.5 } # Collect pitching staff data by franchise franchise_pitching = defaultdict(lambda: { 'pitchers': [], 'total_points': 0, 'count': 0, 'avg_points': 0, 'rarities': defaultdict(int) }) for player in players: franchise = player.get('franchise', 'Unknown') rarity_obj = player.get('rarity', {}) # Extract rarity name from rarity object if isinstance(rarity_obj, dict): rarity = rarity_obj.get('name', 'Unknown') else: rarity = str(rarity_obj) if rarity_obj else 'Unknown' # Determine if pitcher based on positions positions = [] for i in range(1, 9): pos = player.get(f'pos_{i}') if pos: positions.append(pos) is_pitcher = any(pos in ['SP', 'RP', 'CP'] for pos in positions) if is_pitcher and franchise != 'Unknown': points = rarity_points.get(rarity, 0) franchise_pitching[franchise]['pitchers'].append({ 'name': player.get('p_name'), 'rarity': rarity, 'points': points }) franchise_pitching[franchise]['total_points'] += points franchise_pitching[franchise]['count'] += 1 franchise_pitching[franchise]['rarities'][rarity] += 1 # Calculate average points per pitcher for franchise in franchise_pitching: count = franchise_pitching[franchise]['count'] if count > 0: franchise_pitching[franchise]['avg_points'] = ( franchise_pitching[franchise]['total_points'] / count ) # Sort franchises by total points (descending) ranked_teams = sorted( franchise_pitching.items(), key=lambda x: (x[1]['total_points'], x[1]['avg_points']), reverse=True ) # Print rankings print('=' * 120) print('PITCHING STAFF RANKINGS (by total rarity points)') print('=' * 120) print(f'{"Rank":<6} {"Franchise":<25} {"Pitchers":<10} {"Total Pts":<12} {"Avg Pts":<10} {"HoF":<6} {"MVP":<6} {"AS":<6} {"STR":<6} {"RES":<6} {"REP":<6}') print('-' * 120) for rank, (franchise, data) in enumerate(ranked_teams, start=1): hof = data['rarities'].get('Hall of Fame', 0) mvp = data['rarities'].get('MVP', 0) all_star = data['rarities'].get('All-Star', 0) starter = data['rarities'].get('Starter', 0) reserve = data['rarities'].get('Reserve', 0) replacement = data['rarities'].get('Replacement', 0) print(f'{rank:<6} {franchise:<25} {data["count"]:<10} {data["total_points"]:<12.1f} {data["avg_points"]:<10.2f} ' f'{hof:<6} {mvp:<6} {all_star:<6} {starter:<6} {reserve:<6} {replacement:<6}') print('=' * 120) # Print top 5 teams with details print('\n' + '=' * 100) print('TOP 5 PITCHING STAFFS - DETAILED ROSTERS') print('=' * 100) for rank, (franchise, data) in enumerate(ranked_teams[:5], start=1): print(f'\n#{rank} - {franchise.upper()} ({data["total_points"]:.1f} points, {data["count"]} pitchers)') print('-' * 100) # Sort pitchers by points sorted_pitchers = sorted(data['pitchers'], key=lambda x: x['points'], reverse=True) for pitcher in sorted_pitchers: print(f' {pitcher["name"]:<30} {pitcher["rarity"]:<15} ({pitcher["points"]} pts)') # Print bottom 5 teams print('\n' + '=' * 100) print('BOTTOM 5 PITCHING STAFFS - DETAILED ROSTERS') print('=' * 100) for rank, (franchise, data) in enumerate(ranked_teams[-5:], start=len(ranked_teams)-4): print(f'\n#{rank} - {franchise.upper()} ({data["total_points"]:.1f} points, {data["count"]} pitchers)') print('-' * 100) # Sort pitchers by points sorted_pitchers = sorted(data['pitchers'], key=lambda x: x['points'], reverse=True) for pitcher in sorted_pitchers: print(f' {pitcher["name"]:<30} {pitcher["rarity"]:<15} ({pitcher["points"]} pts)') print('\n' + '=' * 100) if __name__ == '__main__': asyncio.run(rank_pitching_staffs(27))