"""
Main entry point for the Radar Data Reader application.
"""

import tkinter as tk
import logging
from pathlib import Path
# --- NUOVO IMPORT ---
import multiprocessing

from radar_data_reader.gui.main_window import MainWindow
from radar_data_reader.gui.gui_utils import center_window
from radar_data_reader.utils import logger
from radar_data_reader.utils.config_manager import ConfigManager
from radar_data_reader.core.app_controller import AppController

LOGGING_CONFIG = {
    "default_root_level": logging.DEBUG,
    "format": "%(asctime)s [%(levelname)-8s] %(name)-20s: %(message)s",
    "date_format": "%H:%M:%S",
    "enable_console": True,
    "enable_file": False,
    "file_path": "radar_reader.log",
    "colors": {
        logging.DEBUG: "gray",
        logging.INFO: "black",
        logging.WARNING: "orange",
        logging.ERROR: "red",
        logging.CRITICAL: "red",
    },
}

# Questo percorso potrebbe essere diverso se l'eseguibile viene spostato.
# Sarebbe meglio gestirlo in modo più robusto, ma per ora lo lasciamo così.
PROJECT_ROOT = Path(__file__).parent.parent
CONFIG_DIR = PROJECT_ROOT / "config"
CONFIG_FILE_PATH = CONFIG_DIR / "config.json"


def main():
    root = None
    try:
        # Per un'applicazione distribuita, il config file dovrebbe essere
        # in una posizione standard (es. AppData) invece che relativa.
        # Per ora, lasciamo così.
        config_path = Path("config/config.json").resolve()
        
        config_manager = ConfigManager(config_path)
        config_manager.load_config()

        controller = AppController(config_manager)

        root = tk.Tk()
        root.withdraw()

        logger.setup_basic_logging(root, LOGGING_CONFIG)

        view = MainWindow(
            master=root, controller=controller, logging_config=LOGGING_CONFIG
        )

        controller.bind_view(view)
        center_window(root)
        view.mainloop()

    except Exception as e:
        # Usa il logger se è già attivo, altrimenti stampa.
        log_or_print = logger.get_logger(__name__) if logger._logging_system_active else print
        
        # Gestisce il caso in cui il logger potrebbe non essere un oggetto Logger valido
        if isinstance(log_or_print, logging.Logger):
            log_or_print.critical(f"A critical error occurred: {e}", exc_info=True)
        else:
            print(f"A critical error occurred: {e}")

        if root:
            root.destroy()


if __name__ == "__main__":
    # --- MODIFICA CRUCIALE PER PYINSTALLER ---
    # Questa chiamata è essenziale per il corretto funzionamento di multiprocessing
    # quando l'applicazione è "congelata" in un eseguibile.
    # Deve essere la prima istruzione dentro il blocco if __name__ == "__main__".
    multiprocessing.freeze_support()

    main()