""" Base configuration class for league-specific game rules. Provides abstract interface that all league configs must implement. Author: Claude Date: 2025-10-28 """ from abc import ABC, abstractmethod from pydantic import BaseModel, Field class BaseGameConfig(BaseModel, ABC): """ Abstract base configuration for all leagues. Defines common game rules and requires league-specific implementations to provide result chart names, API endpoints, and feature flags. """ league_id: str = Field(..., description="League identifier ('sba' or 'pd')") version: str = Field(default="1.0.0", description="Config version for compatibility") # Basic baseball rules (same across leagues) innings: int = Field(default=9, description="Standard innings per game") outs_per_inning: int = Field(default=3, description="Outs required per half-inning") strikes_for_out: int = Field(default=3, description="Strikes for strikeout") # TODO: remove - unneeded balls_for_walk: int = Field(default=4, description="Balls for walk") # TODO: remove - unneeded @abstractmethod def get_result_chart_name(self) -> str: """ Get name of result chart to use for this league. Returns: Chart name identifier (e.g., 'sba_standard_v1') """ pass @abstractmethod def supports_manual_result_selection(self) -> bool: # TODO: consider refactor: manually selecting results is default behavior with PD allowing auto-results as an option """ Whether players manually select results after dice roll. Returns: True if players pick from chart, False if auto-resolved """ pass @abstractmethod def get_api_base_url(self) -> str: """ Get base URL for league's external API. Returns: Base URL for roster/player data API """ pass class Config: """Pydantic configuration.""" frozen = True # Immutable config - prevents accidental modification