# -*- coding: utf-8 -*-
# dispatch/main.py

"""Точка входа независимого приложения Dispatch.

Назначение модуля:
    Минимальная процедура запуска отдельного приложения, которое
    переиспользует модуль `hub.ticket` без копирования его логики.

Последовательность инициализации:
    1. Подготовка диагностики и кодировок до тяжёлых импортов GUI.
    2. Создание `QApplication` и применение системной темы.
    3. Создание `DispatchMainWindow` и эмиссия текущей темы.
    4. Запуск цикла событий `QApplication`.
"""

import sys

from error_logger import install_interpreter_hooks, log_exception, setup_error_logging


def _configure_console_encoding() -> None:
    """Настроить кодировку консоли для корректного вывода кириллицы."""
    import os

    try:
        if sys.platform.startswith("win"):
            import ctypes

            kernel32 = ctypes.windll.kernel32
            kernel32.SetConsoleOutputCP(65001)
            kernel32.SetConsoleCP(65001)
        if hasattr(sys.stdout, "reconfigure"):
            sys.stdout.reconfigure(encoding="utf-8")
        if hasattr(sys.stderr, "reconfigure"):
            sys.stderr.reconfigure(encoding="utf-8")
        os.environ["PYTHONIOENCODING"] = "utf-8"
    except Exception as exc:
        log_exception(__name__, "_configure_console_encoding", exc)


def _bootstrap_runtime_diagnostics() -> None:
    """Включить журнал и перехват исключений до тяжёлых импортов."""
    _configure_console_encoding()
    setup_error_logging()
    install_interpreter_hooks()


def _setup_theme(app) -> str:
    """Определить системную тему и применить базовую палитру окна."""
    from PySide6.QtCore import Qt
    from PySide6.QtGui import QColor, QPalette

    theme = "dark"
    color_scheme = Qt.ColorScheme.Unknown
    if hasattr(app.styleHints(), "preferredColorScheme"):
        color_scheme = app.styleHints().preferredColorScheme()

    if color_scheme == Qt.ColorScheme.Unknown:
        window_color = app.palette().color(QPalette.ColorRole.Window)
        color_scheme = (
            Qt.ColorScheme.Light
            if window_color.lightness() >= 128
            else Qt.ColorScheme.Dark
        )

    if color_scheme == Qt.ColorScheme.Dark:
        theme = "dark"
        palette = app.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor("#232323"))
        palette.setColor(QPalette.ColorRole.WindowText, Qt.GlobalColor.white)
        palette.setColor(QPalette.ColorRole.Base, QColor("#3C3C3C"))
        palette.setColor(QPalette.ColorRole.Text, Qt.GlobalColor.white)
        palette.setColor(QPalette.ColorRole.Button, Qt.GlobalColor.darkGray)
        palette.setColor(QPalette.ColorRole.ButtonText, Qt.GlobalColor.white)
        palette.setColor(QPalette.ColorRole.Highlight, QColor("#5B9FFF"))
        palette.setColor(QPalette.ColorRole.HighlightedText, Qt.GlobalColor.black)
        app.setPalette(palette)
    else:
        theme = "light"
        palette = app.palette()
        palette.setColor(QPalette.ColorRole.Window, QColor("#F8F9FB"))
        palette.setColor(QPalette.ColorRole.WindowText, QColor("#172B4D"))
        palette.setColor(QPalette.ColorRole.Base, QColor("#F8F9FB"))
        palette.setColor(QPalette.ColorRole.Text, QColor("#172B4D"))
        palette.setColor(QPalette.ColorRole.Button, QColor("#FFFFFF"))
        palette.setColor(QPalette.ColorRole.ButtonText, QColor("#172B4D"))
        palette.setColor(QPalette.ColorRole.Highlight, QColor("#0C66E4"))
        palette.setColor(QPalette.ColorRole.HighlightedText, QColor("#FFFFFF"))
        app.setPalette(palette)
    return theme


def main() -> None:
    """Запустить независимое приложение Dispatch."""
    _bootstrap_runtime_diagnostics()

    from PySide6.QtWidgets import QApplication

    from gui.theme_bus import theme_bus

    from window import DispatchMainWindow

    app = QApplication(sys.argv)
    app.setStyle("Fusion")
    app.setApplicationName("Dispatch")

    current_theme = _setup_theme(app)

    window = DispatchMainWindow()
    theme_bus.theme_changed.emit(current_theme)
    window.show()

    sys.exit(app.exec())


if __name__ == "__main__":
    main()
