"""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

        class Api:
            """Můstek do nativních dialogů — WKWebView neumí stahovat."""

            def pick_folder(self):
                try:
                    w = webview.windows[0]
                    r = w.create_file_dialog(webview.FOLDER_DIALOG)
                    if not r:
                        return ""
                    return r[0] if isinstance(r, (list, tuple)) else str(r)
                except Exception:
                    return ""

        webview.create_window(f"Bábofkátor {__version__}", url,
                              width=1460, height=940, min_size=(1080, 680),
                              js_api=Api())
        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())
