#!/usr/bin/env python3
"""Port-80-Redirect für Dispatcher Cockpit.

Lauscht auf Port 80 und leitet JEDEN Request per 302 weiter auf:
  http://<host-aus-request>:8089/start.html

Nutzt den Host-Header damit Tailscale-Zugriffe (100.x.x.x) nie
eine LAN-IP (192.168.0.x) zurückbekommen.
Keine externen Abhängigkeiten — nur stdlib.
"""

import http.server
import sys
import time

LAN_FALLBACK = "Minimac.local"
BIND_HOST = ""   # alle Interfaces
BIND_PORT = 80


class RedirectHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self._redirect()

    def do_POST(self):
        self._redirect()

    def do_HEAD(self):
        self._redirect()

    def _redirect(self):
        # Host-Header auslesen → IP/Hostname ohne Port
        raw_host = self.headers.get("Host", LAN_FALLBACK)
        host = raw_host.split(":")[0] or LAN_FALLBACK
        target = f"http://{host}:8089/start.html"
        self.send_response(302)
        self.send_header("Location", target)
        self.send_header("Content-Length", "0")
        self.end_headers()

    def log_message(self, fmt, *args):
        # Minimales Logging: Timestamp + Kurzinfo
        ts = time.strftime("%Y-%m-%d %H:%M:%S")
        sys.stdout.write(f"[port80] {ts} {fmt % args}\n")
        sys.stdout.flush()


def main():
    retry = 0
    while True:
        try:
            server = http.server.HTTPServer((BIND_HOST, BIND_PORT), RedirectHandler)
            sys.stdout.write(f"[port80] Redirect aktiv — Port {BIND_PORT} → http://<host>:8089/start.html\n")
            sys.stdout.flush()
            server.serve_forever()
        except OSError as e:
            retry += 1
            if retry > 5:
                sys.stderr.write(f"[port80] FEHLER: Port {BIND_PORT} dauerhaft nicht bindbar: {e}\n")
                sys.stderr.flush()
                sys.exit(1)
            wait = retry * 5
            sys.stderr.write(
                f"[port80] Port {BIND_PORT} belegt ({e}) — warte {wait}s, Versuch {retry}/5\n"
            )
            sys.stderr.flush()
            time.sleep(wait)
        except KeyboardInterrupt:
            sys.stdout.write("[port80] Gestoppt.\n")
            sys.stdout.flush()
            sys.exit(0)


if __name__ == "__main__":
    main()
