"""Spuštění Bábofkátoru jako desktopové aplikace.

Server běží na pozadí, rozhraní se otevře v nativním okně (pywebview).
Není-li pywebview k dispozici, otevře se výchozí prohlížeč.
"""
from __future__ import annotations

import socket
import sys
import threading
import time
import webbrowser


def _free_port(preferred: int = 8765) -> int:
    for p in (preferred, 0):
        s = socket.socket()
        try:
            s.bind(("127.0.0.1", p))
            port = s.getsockname()[1]
            s.close()
            return port
        except OSError:
            s.close()
    return preferred


def main():
    from . import __version__
    from .webapp import app

    port = _free_port()
    url = f"http://127.0.0.1:{port}/"

    def serve():
        app.run(host="127.0.0.1", port=port, debug=False, threaded=True,
                use_reloader=False)

    threading.Thread(target=serve, daemon=True).start()

    for _ in range(100):                       # počkat na start serveru
        try:
            s = socket.create_connection(("127.0.0.1", port), 0.2)
            s.close()
            break
        except OSError:
            time.sleep(0.1)

    try:
        import webview                          # pywebview
        webview.create_window(f"Bábofkátor {__version__}", url,
                              width=1460, height=940, min_size=(1080, 680))
        webview.start()
        return 0
    except Exception:
        print(f"Bábofkátor {__version__} — {url}")
        print("(nativní okno není k dispozici, otevírám prohlížeč; "
              "aplikaci ukončíš zavřením tohoto okna)")
        webbrowser.open(url)
        try:
            while True:
                time.sleep(3600)
        except KeyboardInterrupt:
            return 0


if __name__ == "__main__":
    sys.exit(main())
