"""
Логирование приложения.

Два обработчика:
    * файловый (RotatingFileHandler) — аналог $LogFile из ps1;
    * Qt-обработчик, потокобезопасно транслирующий записи в GUI через сигнал,
      т.к. сканирование выполняется в фоновом QThread.
"""
from __future__ import annotations

import logging
import logging.handlers
from datetime import datetime
from typing import Tuple

from PySide6.QtCore import QObject, Signal

from app.config import LOG_DIR, LOG_FILE

LOGGER_NAME = "dspscanner"


class QtLogHandler(logging.Handler, QObject):
    """Обработчик логов, транслирующий записи в GUI через Qt-сигнал (thread-safe)."""

    new_record = Signal(str, str)  # (level_name, formatted_message)

    def __init__(self) -> None:
        logging.Handler.__init__(self)
        QObject.__init__(self)

    def emit(self, record: logging.LogRecord) -> None:
        try:
            msg = self.format(record)
            self.new_record.emit(record.levelname, msg)
        except Exception:
            self.handleError(record)


def setup_logger() -> Tuple[logging.Logger, QtLogHandler]:
    LOG_DIR.mkdir(parents=True, exist_ok=True)

    logger = logging.getLogger(LOGGER_NAME)
    logger.setLevel(logging.DEBUG)
    logger.handlers.clear()
    logger.propagate = False

    fmt = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S")

    file_handler = logging.handlers.RotatingFileHandler(
        LOG_FILE, maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8"
    )
    file_handler.setFormatter(fmt)
    file_handler.setLevel(logging.INFO)
    logger.addHandler(file_handler)

    qt_handler = QtLogHandler()
    qt_handler.setFormatter(fmt)
    qt_handler.setLevel(logging.DEBUG)
    logger.addHandler(qt_handler)

    return logger, qt_handler


def timestamp() -> str:
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
