import json from pathlib import Path from pydantic_settings import BaseSettings, SettingsConfigDict from app.models import ( UserAppSettings, UserFansifterSettings, UserSettings, UserTwilioSettings, ) class Config(BaseSettings): model_config = SettingsConfigDict(env_prefix="", case_sensitive=False) delay_min: float = 3.0 delay_max: float = 7.0 texts_path: Path = Path(__file__).parent / "texts.json" static_dir: Path = Path(__file__).parent / "static" default_user_settings: UserSettings | None = None @property def delay_range(self) -> tuple[float, float]: return (self.delay_min, self.delay_max) def init_defaults(self) -> None: """Load texts.json and build default user settings if not already initialized.""" if self.default_user_settings is not None: return texts = json.loads(self.texts_path.read_text()) app_settings = UserAppSettings( delay_min=int(self.delay_min), delay_max=int(self.delay_max), artist_name="Mozart", show_events=True, ) twilio_settings = UserTwilioSettings( opt_out_keywords=["stop"], opt_out_message=texts.get("stop", "You have opted out."), opt_in_keywords=["start"], opt_in_message=texts.get("opt_in", "You have opted in."), help_keywords=["help"], help_message=texts.get("help", "This is the help message."), ) fansifter_settings = UserFansifterSettings( opt_in=texts.get("opt_in", ""), opt_in_terms=texts.get("opt_in_terms", ""), welcome=texts.get("welcome", ""), welcome_instructions=texts.get("welcome_instructions", ""), info=texts.get("info", ""), ) self.default_user_settings = UserSettings( app_settings=app_settings, twilio_settings=twilio_settings, fansifter_settings=fansifter_settings, ) def clone_default_user_settings(self) -> UserSettings: self.init_defaults() if self.default_user_settings is None: raise RuntimeError("default_user_settings not initialized") return UserSettings.model_validate_json(self.default_user_settings.model_dump_json()) settings = Config() settings.init_defaults()