import asyncio from collections import defaultdict from db_calls import db_get async def analyze_cardset_rarity(cardset_id: int = 27): """Analyze players by franchise and rarity for a given cardset.""" 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") # First pass: collect all unique rarity names all_rarities = set() for player in players: rarity_obj = player.get("rarity", {}) if isinstance(rarity_obj, dict): rarity_name = rarity_obj.get("name") if rarity_name: all_rarities.add(rarity_name) sorted_rarities = sorted( all_rarities, key=lambda x: ( { "Common": 0, "Uncommon": 1, "Rare": 2, "Epic": 3, "Legend": 4, "Starter": 0, "Bench": 1, "All-Star": 2, "MVP": 3, "Hall of Fame": 4, }.get(x, 99), x, ), ) print(f"Found rarities: {sorted_rarities}\n") # Group players by franchise and rarity franchise_data = defaultdict( lambda: { "batters": defaultdict(int), "pitchers": defaultdict(int), "combined": 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 batter or 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: franchise_data[franchise]["pitchers"][rarity] += 1 else: franchise_data[franchise]["batters"][rarity] += 1 franchise_data[franchise]["combined"][rarity] += 1 # Sort franchises alphabetically sorted_franchises = sorted(franchise_data.keys()) # Print batters print("=" * 100) print("BATTERS BY FRANCHISE AND RARITY") print("=" * 100) # Build header dynamically header = f'{"Franchise":<20}' for rarity in sorted_rarities: header += f" {rarity:<12}" header += f' {"Total":<10}' print(header) print("-" * 100) batter_totals = defaultdict(int) for franchise in sorted_franchises: batters = franchise_data[franchise]["batters"] total = sum(batters.values()) if total > 0: row = f"{franchise:<20}" for rarity in sorted_rarities: count = batters.get(rarity, 0) row += f" {count:<12}" batter_totals[rarity] += count row += f" {total:<10}" batter_totals["Total"] += total print(row) print("-" * 100) total_row = f'{"TOTAL":<20}' for rarity in sorted_rarities: total_row += f" {batter_totals[rarity]:<12}" total_row += f' {batter_totals["Total"]:<10}' print(total_row) # Print pitchers print("\n" + "=" * 100) print("PITCHERS BY FRANCHISE AND RARITY") print("=" * 100) header = f'{"Franchise":<20}' for rarity in sorted_rarities: header += f" {rarity:<12}" header += f' {"Total":<10}' print(header) print("-" * 100) pitcher_totals = defaultdict(int) for franchise in sorted_franchises: pitchers = franchise_data[franchise]["pitchers"] total = sum(pitchers.values()) if total > 0: row = f"{franchise:<20}" for rarity in sorted_rarities: count = pitchers.get(rarity, 0) row += f" {count:<12}" pitcher_totals[rarity] += count row += f" {total:<10}" pitcher_totals["Total"] += total print(row) print("-" * 100) total_row = f'{"TOTAL":<20}' for rarity in sorted_rarities: total_row += f" {pitcher_totals[rarity]:<12}" total_row += f' {pitcher_totals["Total"]:<10}' print(total_row) # Print combined print("\n" + "=" * 100) print("COMBINED (BATTERS + PITCHERS) BY FRANCHISE AND RARITY") print("=" * 100) header = f'{"Franchise":<20}' for rarity in sorted_rarities: header += f" {rarity:<12}" header += f' {"Total":<10}' print(header) print("-" * 100) combined_totals = defaultdict(int) for franchise in sorted_franchises: combined = franchise_data[franchise]["combined"] total = sum(combined.values()) row = f"{franchise:<20}" for rarity in sorted_rarities: count = combined.get(rarity, 0) row += f" {count:<12}" combined_totals[rarity] += count row += f" {total:<10}" combined_totals["Total"] += total print(row) print("-" * 100) total_row = f'{"TOTAL":<20}' for rarity in sorted_rarities: total_row += f" {combined_totals[rarity]:<12}" total_row += f' {combined_totals["Total"]:<10}' print(total_row) print("=" * 100) if __name__ == "__main__": asyncio.run(analyze_cardset_rarity(27))