import logging
from logging.handlers import RotatingFileHandler
import os
from datetime import datetime

def setup_logger(name: str, log_dir: str = "logs", log_type: str = 'both') -> logging.Logger:
    """
    Set up a logger with both file and console handlers.
    
    Args:
        name: Name of the logger (usually __name__)
        log_dir: Directory to store log files
        log_type: Type of log to write to file ('both', 'file', 'console')
    """
    # Create logger
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    date_format = '%Y-%m-%d %H:%M:%S'

    if log_type == 'both':
        log_to_file = True
        log_to_console = True
    elif log_type == 'file':
        log_to_file = True
        log_to_console = False
    elif log_type == 'console':
        log_to_file = False
        log_to_console = True
    else:
        raise ValueError(f"Invalid log type: {log_type}")
    
    if log_to_file:
        # Create logs directory if it doesn't exist
        os.makedirs(log_dir, exist_ok=True)

        # Create formatters
        file_formatter = logging.Formatter(
            '%(asctime)s | %(levelname)s | %(name)s | %(funcName)s | %(message)s',
            datefmt=date_format
        )

        # File handler (rotating)
        file_handler = RotatingFileHandler(
            filename=os.path.join(log_dir, f"{datetime.now().strftime('%Y-%m-%d')}.log"),
            maxBytes=10*1024*1024,  # 10MB
            backupCount=5
        )
        file_handler.setLevel(logging.INFO)
        file_handler.setFormatter(file_formatter)

        logger.addHandler(file_handler)

    if log_to_console:
        console_formatter = logging.Formatter(
            '%(asctime)s | %(levelname)s | %(message)s',
            datefmt=date_format
        )
        
        # Console handler
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        console_handler.setFormatter(console_formatter)

        logger.addHandler(console_handler)

    return logger
