import logging
import os
from typing import Optional

def setup_logger(name: Optional[str] = None, level: Optional[str] = None) -> logging.Logger:
    """
    Configure a logger with a specified name and log level.
    
    Args:
        name: Optional logger name (uses root logger if None)
        level: Optional log level (uses INFO if None)
        
    Returns:
        Configured logger
    """
    # Get the logger
    logger = logging.getLogger(name) if name else logging.getLogger()
    
    # Set level (default to INFO)
    if level:
        logger.setLevel(getattr(logging, level.upper()))
    else:
        logger.setLevel(logging.INFO)
    
    # Remove existing handlers to prevent duplicate logs
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
    
    # Create console handler with formatter
    handler = logging.StreamHandler()
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    
    return logger

def configure_global_logging(level: Optional[str] = None) -> None:
    """
    Configure the root logger for the entire application.
    
    Args:
        level: Optional log level (uses INFO if None)
    """
    # Set up the root logger
    root_logger = setup_logger(level=level)
    
    # Reduce logging for noisy libraries
    reduce_logging_verbosity()

def set_log_level(logger: logging.Logger, level_name: str = 'INFO') -> None:
    """
    Set the log level for an existing logger.
    
    Args:
        logger: The logger to modify
        level_name: The level name (default: INFO)
    """
    try:
        level = getattr(logging, level_name.upper())
        logger.setLevel(level)
    except AttributeError:
        logger.warning(f"Invalid log level: {level_name}, using INFO")
        logger.setLevel(logging.INFO)

def reduce_logging_verbosity() -> None:
    """
    Reduce the verbosity of common loggers that tend to be noisy.
    """
    # List of loggers to reduce verbosity
    noisy_loggers = [
        'boto3',
        'botocore',
        'urllib3',
        's3transfer',
        'PIL'
    ]
    
    # Set all noisy loggers to WARNING level
    for logger_name in noisy_loggers:
        logging.getLogger(logger_name).setLevel(logging.WARNING) 