import os

from src.utils.dpi import enablePerMonitorAwareness

enablePerMonitorAwareness()

from src.gameplay.context import context
from src.gameplay.threads.pilotNG import PilotNGThread
from src.gameplay.threads.ui import UIThread
from src.gameplay.threads.alert import AlertThread
from src.ui.context import Context
from src.utils.ino import requireArduino


def shouldStartUi():
    return os.getenv('TIBIAPILOT_AUTOSTART') != '1'


def startWebUi():
    """Web-Server im Bot-Prozess: ein Prozess, keine Extra-Latenz.

    Laeuft immer mit (Daemon-Thread, liest nur die Statusdateien), damit
    PilotNG.exe sich an jeden Bot-Start haengen kann — egal ob er per
    One-Click, per Aufgabe oder von Hand gestartet wurde. Faellt der
    Server aus (z. B. Port belegt), laeuft der Bot ungestoert weiter.
    """
    from threading import Thread

    def run():
        try:
            from webui.server import main as webuiMain
            webuiMain()
        except Exception:  # noqa: BLE001 — UI darf den Bot nie stoppen
            pass

    Thread(target=run, daemon=True).start()


def main():
    contextInstance = Context(context)
    if os.getenv('TIBIAPILOT_AUTOSTART') == '1':
        requireArduino()
        contextInstance.context['ng_pause'] = False
    if os.getenv('TIBIAPILOT_WEBUI') != '0':
        startWebUi()
    if shouldStartUi():
        uiThreadInstance = UIThread(contextInstance)
        uiThreadInstance.start()
    alertThreadInstance = AlertThread(contextInstance)
    alertThreadInstance.start()
    pilotNGThreadInstance = PilotNGThread(contextInstance)
    pilotNGThreadInstance.mainloop()

if __name__ == '__main__':
    main()
