+from typing import Dict, List
+from ex4.TournamentCard import TournamentCard
+
+
+class TournamentPlatform:
+ """Platform for managing tournaments and rankings."""
+
+ def __init__(self):
+ self.registered_cards: Dict[str, TournamentCard] = {}
+ self.matches_played = 0
+
+ def register_card(self, card: TournamentCard) -> str:
+ """Register a card for tournaments and return its ID."""
+ # Simple ID generation for the example
+ name_part = card.name.lower().replace(" ", "_")
+ card_id = f"{name_part}_{len(self.registered_cards) + 1:03d}"
+ self.registered_cards[card_id] = card
+ return card_id
+
+ def create_match(self, card1_id: str, card2_id: str) -> Dict:
+ """Simulate a match between two cards and update ratings."""
+ if (
+ card1_id not in self.registered_cards
+ or card2_id not in self.registered_cards
+ ):
+ raise ValueError("Both cards must be registered.")
+
+ c1 = self.registered_cards[card1_id]
+ c2 = self.registered_cards[card2_id]
+
+ # Simple winner determination (e.g., higher attack wins)
+ if c1.attack_power >= c2.attack_power:
+ winner_id, loser_id = card1_id, card2_id
+ winner, loser = c1, c2
+ else:
+ winner_id, loser_id = card2_id, card1_id
+ winner, loser = c2, c1
+
+ # Rating update simulation (simplified Elo-like)
+ rating_change = 16
+ winner.rating += rating_change
+ loser.rating -= rating_change
+ winner.update_wins(1)
+ loser.update_losses(1)
+
+ self.matches_played += 1
+
+ return {
+ "winner": winner_id,
+ "loser": loser_id,
+ "winner_rating": winner.rating,
+ "loser_rating": loser.rating,
+ }
+
+ def get_leaderboard(self) -> List[str]:
+ """Return a sorted list of cards by rating."""
+ sorted_cards = sorted(
+ self.registered_cards.values(),
+ key=lambda c: c.rating,
+ reverse=True,
+ )
+ leaderboard = []
+ for i, card in enumerate(sorted_cards, 1):
+ leaderboard.append(
+ f"{i}. {card.name} - Rating: {card.rating} "
+ f"({card.wins}-{card.losses})"
+ )
+ return leaderboard
+
+ def generate_tournament_report(self) -> Dict:
+ """Generate a report for the platform."""
+ total_rating = sum(c.rating for c in self.registered_cards.values())
+ avg_rating = (
+ total_rating / len(self.registered_cards)
+ if self.registered_cards
+ else 0
+ )
+
+ return {
+ "total_cards": len(self.registered_cards),
+ "matches_played": self.matches_played,
+ "avg_rating": int(avg_rating),
+ "platform_status": "active",
+ }