"""Game Speed Validation and Management Functions"""
import logging
from config import config

# Set up logger
logger = logging.getLogger(__name__)

# ============================================================
# Game Speed Validation Functions
# ============================================================

def validate_game_speed(speed, allow_question_pause=False):
    """
    Validate and clamp game speed to acceptable range.

    Args:
        speed: The speed value to validate (can be int, str, or any type)
        allow_question_pause: If True, allows SPEED_QUESTION_PAUSE value (100000)

    Returns:
        int: A valid game speed within acceptable bounds

    Note:
        - Higher speed values = slower gameplay (more ticks between updates)
        - Uses DEBUG mode settings if config.DEBUG is True
        - In debug mode, allows speeds from 1 (5000 updates/sec) to 100000
        - In production mode, allows speeds from 1 to 10000
    """
    try:
        speed = int(speed)

        # Determine min/max based on debug mode
        if config.DEBUG:
            min_speed = config.DEBUG_SPEED_MIN
            max_speed = config.DEBUG_SPEED_MAX
        else:
            min_speed = config.SPEED_MIN
            max_speed = config.SPEED_MAX

        # Allow question pause value if specified
        if allow_question_pause and speed == config.SPEED_QUESTION_PAUSE:
            return speed

        # Clamp to valid range
        validated_speed = max(min_speed, min(speed, max_speed))

        if validated_speed != speed:
            logger.warning(f"Game speed {speed} out of bounds, clamped to {validated_speed}")

        return validated_speed

    except (ValueError, TypeError) as e:
        logger.error(f"Invalid game speed value: {speed} ({type(speed).__name__}), using default")
        return config.SPEED_DEFAULT

def get_speed_button_values():
    """
    Get the appropriate speed button values based on debug mode.

    Returns:
        list: Speed values for +/- button navigation
    """
    return config.DEBUG_SPEED_BUTTON_VALUES if config.DEBUG else config.SPEED_BUTTON_VALUES

def log_speed_change(user_id, old_speed, new_speed, source="manual"):
    """
    Log speed changes for debugging and monitoring.

    Args:
        user_id: User/player identifier
        old_speed: Previous speed value
        new_speed: New speed value
        source: Source of the change (manual, button, reset, question, etc.)
    """
    # Calculate approximate updates per second
    old_ups = 5000 / old_speed if old_speed > 0 else 0
    new_ups = 5000 / new_speed if new_speed > 0 else 0

    logger.info(
        f"Speed change [user={user_id}] [{source}]: "
        f"{old_speed} ({old_ups:.1f} ups) → {new_speed} ({new_ups:.1f} ups)"
    )

# ============================================================
# End Game Speed Functions
# ============================================================
