"""
Application configuration management.

Uses pydantic-settings for typed configuration with environment variable overrides.
"""
from pydantic_settings import BaseSettings
from typing import Optional
from functools import lru_cache


class Settings(BaseSettings):
    """Application settings loaded from environment variables or .env file."""
    
    # Application
    APP_NAME: str = "MTG Online"
    APP_VERSION: str = "0.2.0"
    DEBUG: bool = False
    SECRET_KEY: str = "change-me-in-production"
    JWT_SECRET_KEY: str = "change-me-in-production"
    
    # Database - Primary (mtgonline app)
    DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/mtgo_platform"
    
    # Database - Secondary (mtgjson data)
    MTG_DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/mtg_data"
    
    # Redis
    REDIS_URL: str = "redis://localhost:6379/0"
    
    # JWT Configuration
    JWT_ALGORITHM: str = "HS256"
    JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
    JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = 7
    
    # CORS
    CORS_ORIGINS: list[str] = ["http://localhost:3000", "http://localhost:8000"]
    
    # Email (for password reset, account activation)
    SMTP_HOST: Optional[str] = None
    SMTP_PORT: int = 587
    SMTP_USER: Optional[str] = None
    SMTP_PASSWORD: Optional[str] = None
    EMAIL_FROM: Optional[str] = None
    
    # Security
    BCRYPT_ROUNDS: int = 12
    MAX_LOGIN_ATTEMPTS: int = 5
    LOGIN_BLOCK_MINUTES: int = 15
    
    # MTG Data Refresh
    MTG_REFRESH_INTERVAL_DAYS: int = 7
    DATA_DIR: str = "/app/data"
    UPLOAD_DIR: str = "/app/uploads"
    
    # Database configuration
    DB_CONFIG: dict = {
        "engine": "postgresql+asyncpg",
        "user": "mtgonline",
        "password": "mtgonline_pass",
        "host": "postgres",
        "port": 5432,
    }
    
    # Logging
    LOG_LEVEL: str = "INFO"
    
    # Redis configuration
    REDIS_CONFIG: dict = {
        "host": "redis",
        "port": 6379,
        "db": 0,
    }
    
    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"
        extra = "allow"  # Allow extra env vars


@lru_cache()
def get_settings() -> Settings:
    """Get cached application settings."""
    return Settings()
