"""
Configuration management using environment variables.

Usage:
    from config import config
    db_password = config.DB_PASSWORD
"""

import os
from pathlib import Path
from typing import Optional

# Load .env file if exists
try:
    from dotenv import load_dotenv
    env_path = Path(__file__).parent.parent / '.env'
    if env_path.exists():
        load_dotenv(dotenv_path=env_path)
except ImportError:
    print("Warning: python-dotenv not installed. Using environment variables only.")


class Config:
    """Application configuration from environment variables"""

    # Database
    DB_HOST: str = os.getenv('DB_HOST', 'localhost')
    DB_PORT: int = int(os.getenv('DB_PORT', '3306'))
    DB_USER: str = os.getenv('DB_USER', 'root')
    DB_PASSWORD: str = os.getenv('DB_PASSWORD', '')
    DB_NAME: str = os.getenv('DB_NAME', 'lifesim')

    # AI Conversation
    OPENAI_API_KEY: str = os.getenv('OPENAI_API_KEY', '')
    CONVERSATION_MODEL_PROVIDER: str = os.getenv('CONVERSATION_MODEL_PROVIDER', 'openai')  # 'openai' (currently only supported provider)
    CONVERSATION_MODEL_NAME: str = os.getenv('CONVERSATION_MODEL_NAME', 'gpt-5.1-2025-11-13')  # Model to use for conversations (supports verbosity parameter)

    # AI Image Generation
    FAL_AI_KEY: str = os.getenv('FAL_AI_KEY', '')
    REPLICATE_API_TOKEN: str = os.getenv('REPLICATE_API_TOKEN', '')
    IMAGE_GENERATION_PROVIDER: str = os.getenv('IMAGE_GENERATION_PROVIDER', 'imagen4')  # 'imagen4' (recommended), 'flux', or 'dalle3'

    # Security
    JWT_SECRET: str = os.getenv('JWT_SECRET', 'dev-secret-change-in-production')
    SESSION_TIMEOUT: int = int(os.getenv('SESSION_TIMEOUT', '3600'))
    ALLOWED_ORIGINS: list = os.getenv('ALLOWED_ORIGINS', '*').split(',')

    # Application
    ENVIRONMENT: str = os.getenv('ENVIRONMENT', 'development')
    DEBUG: bool = os.getenv('DEBUG', 'false').lower() == 'true'
    LOG_LEVEL: str = os.getenv('LOG_LEVEL', 'INFO')
    MAX_CONNECTIONS: int = int(os.getenv('MAX_CONNECTIONS', '20'))  # Reduced from 100 to prevent exhaustion

    # Rate Limiting
    OPENAI_MAX_REQUESTS_PER_HOUR: int = int(os.getenv('OPENAI_MAX_REQUESTS_PER_HOUR', '60'))
    WEBSOCKET_MAX_MESSAGES_PER_MINUTE: int = int(os.getenv('WEBSOCKET_MAX_MESSAGES_PER_MINUTE', '30'))

    # Testing
    TEST_MODE: bool = os.getenv('TEST_MODE', 'false').lower() == 'true'

    # Game Speed Configuration
    # Note: Higher values = slower game (more ticks between updates)
    # The server runs at 5000 FPS, game logic runs at 5000/gameSpeed Hz
    SPEED_PAUSED: int = 10000                    # Default/paused speed (0.5 updates/sec)
    SPEED_QUESTION_PAUSE: int = 100000           # Pause during questions (0.05 updates/sec)
    SPEED_MIN: int = 1                           # Maximum speed (5000 updates/sec) - DEBUG MODE
    SPEED_MAX: int = 10000                       # Minimum speed (0.5 updates/sec)
    SPEED_DEFAULT: int = 10000                   # Starting speed
    SPEED_BUTTON_VALUES: list = [10000, 1000, 500, 50, 20, 1]  # Speed progression for +/- buttons

    # Debug Mode Speed Settings
    DEBUG_SPEED_MIN: int = 1                     # Allow maximum speed in debug
    DEBUG_SPEED_MAX: int = 100000                # Allow any speed up to question pause
    DEBUG_SPEED_BUTTON_VALUES: list = [10000, 1000, 500, 50, 20, 10, 5, 1]  # More granular speeds

    @classmethod
    def validate(cls):
        """Validate required configuration"""
        errors = []

        if not cls.DB_PASSWORD and not cls.TEST_MODE:
            errors.append("DB_PASSWORD not set (set via environment or .env file)")

        if not cls.OPENAI_API_KEY and not cls.TEST_MODE:
            errors.append("OPENAI_API_KEY not set (set via environment or .env file)")

        if cls.ENVIRONMENT == 'production' and cls.JWT_SECRET == 'dev-secret-change-in-production':
            errors.append("JWT_SECRET must be changed in production")

        if errors:
            print(f"Configuration warnings: {', '.join(errors)}")
            print("Note: These can be ignored in test mode or local development")

    @classmethod
    def get_database_url(cls) -> str:
        """Get database connection URL"""
        return f"mysql://{cls.DB_USER}:{cls.DB_PASSWORD}@{cls.DB_HOST}:{cls.DB_PORT}/{cls.DB_NAME}"


# Singleton instance
config = Config()

# Validate on import (except in test mode)
if not config.TEST_MODE:
    config.validate()
