"""Application settings and environment configuration.""" from functools import lru_cache from pathlib import Path from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Defines runtime configuration values loaded from environment variables.""" model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") app_name: str = "dcm-dms" app_env: str = "development" database_url: str = "postgresql+psycopg://dcm:dcm@db:5432/dcm" redis_url: str = "redis://redis:6379/0" storage_root: Path = Path("/data/storage") upload_chunk_size: int = 4 * 1024 * 1024 max_zip_members: int = 250 max_zip_depth: int = 2 max_text_length: int = 500_000 default_openai_base_url: str = "https://api.openai.com/v1" default_openai_model: str = "gpt-4.1-mini" default_openai_timeout_seconds: int = 45 default_openai_handwriting_enabled: bool = True default_openai_api_key: str = "" default_summary_model: str = "gpt-4.1-mini" default_routing_model: str = "gpt-4.1-mini" typesense_protocol: str = "http" typesense_host: str = "typesense" typesense_port: int = 8108 typesense_api_key: str = "dcm-typesense-key" typesense_collection_name: str = "documents" typesense_timeout_seconds: int = 120 typesense_num_retries: int = 0 public_base_url: str = "http://localhost:8000" cors_origins: list[str] = Field(default_factory=lambda: ["http://localhost:5173", "http://localhost:3000"]) @lru_cache(maxsize=1) def get_settings() -> Settings: """Returns a cached settings object for dependency injection and service access.""" return Settings()