import logging
import os
from pathlib import Path
from logging.handlers import RotatingFileHandler

# Module level logger instance
_logger = None

def setup_logger(log_file='fabric_to_espanso.log'):
    """
    Set up and configure the logger for the application.

    Args:
        log_file (str): Name of the log file. Defaults to 'fabric_to_espanso.log'.

    Returns:
        logging.Logger: Configured logger object.
    """
    global _logger
    if _logger is not None:
        return _logger
        
    logger = logging.getLogger('fabric_to_espanso')
    
    # Clean up any existing handlers
    logger.handlers.clear()
    
    # Set log level and prevent propagation
    logger.setLevel(logging.INFO)
    logger.propagate = False

    # Get the project root directory (2 levels up from logger.py)
    project_root = Path(__file__).parent.parent.parent

    # Create logs directory if it doesn't exist - use absolute path
    log_dir = project_root / "logs"
    log_dir.mkdir(exist_ok=True)

    # Create file handlers with absolute path
    log_file_path = log_dir / f"{log_file}"
    file_handler = RotatingFileHandler(log_file_path, maxBytes=1024*1024, backupCount=5)
    console_handler = logging.StreamHandler()

    # Set log levels
    file_handler.setLevel(logging.DEBUG)
    console_handler.setLevel(logging.DEBUG)

    # Create formatters and add it to handlers
    file_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    
    file_handler.setFormatter(file_format)
    console_handler.setFormatter(console_format)

    # Add handlers to the logger
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    _logger = logger
    return logger