"""
Non-blocking logging setup using QueueHandler.
"""
import logging
import logging.handlers
import queue
import sys
from pathlib import Path


_LOG_QUEUE: queue.Queue | None = None
_QUEUE_LISTENER: logging.handlers.QueueListener | None = None


def setup_logging(
    level: int = logging.INFO,
    log_file: str | None = "arbitrage.log",
) -> None:
    """
    Set up non-blocking logging with a queue handler.

    Logs go to both console and file (if specified).
    Uses a background thread to handle actual I/O.
    """
    global _LOG_QUEUE, _QUEUE_LISTENER

    # Create queue for non-blocking logging
    _LOG_QUEUE = queue.Queue(-1)

    # Create formatters
    console_formatter = logging.Formatter(
        "[%(asctime)s.%(msecs)03d] [%(levelname)s] [%(name)s] %(message)s",
        datefmt="%H:%M:%S",
    )
    file_formatter = logging.Formatter(
        "[%(asctime)s.%(msecs)03d] [%(levelname)s] [%(name)s] %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )

    # Console handler
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setFormatter(console_formatter)
    console_handler.setLevel(level)

    handlers = [console_handler]

    # File handler (if specified)
    if log_file:
        log_path = Path(log_file)
        file_handler = logging.handlers.RotatingFileHandler(
            log_path,
            maxBytes=10 * 1024 * 1024,  # 10 MB
            backupCount=5,
        )
        file_handler.setFormatter(file_formatter)
        file_handler.setLevel(level)
        handlers.append(file_handler)

    # Create queue listener (runs in background thread)
    _QUEUE_LISTENER = logging.handlers.QueueListener(
        _LOG_QUEUE,
        *handlers,
        respect_handler_level=True,
    )
    _QUEUE_LISTENER.start()

    # Configure root logger to use queue handler
    queue_handler = logging.handlers.QueueHandler(_LOG_QUEUE)
    root_logger = logging.getLogger()
    root_logger.setLevel(level)
    root_logger.addHandler(queue_handler)


def get_logger(name: str) -> logging.Logger:
    """Get a logger instance for the given name."""
    return logging.getLogger(name)


def shutdown_logging() -> None:
    """Gracefully shutdown the logging system."""
    global _QUEUE_LISTENER
    if _QUEUE_LISTENER:
        _QUEUE_LISTENER.stop()
        _QUEUE_LISTENER = None
