#!/usr/bin/env python3
"""
HTTP und HTTPS Server mit Let's Encrypt Zertifikaten
HTTP auf Port 8080, HTTPS auf Port 8443
"""

import http.server
import ssl
import os
import threading
from pathlib import Path

# Konfiguration
HTTP_PORT = 8080
HTTPS_PORT = 8443
CERT_DIR = Path(__file__).parent / "cert"  # cert Ordner für Zertifikate

# Pfade zu den Zertifikatsdateien
FULLCHAIN_PATH = CERT_DIR / "fullchain.pem"
PRIVKEY_PATH = CERT_DIR / "privkey.pem"


def start_http_server():
    """Startet den HTTP-Server"""
    handler = http.server.SimpleHTTPRequestHandler
    with http.server.HTTPServer(("0.0.0.0", HTTP_PORT), handler) as httpd:
        print(f"✓ HTTP-Server läuft auf http://0.0.0.0:{HTTP_PORT}")
        httpd.serve_forever()


def start_https_server():
    """Startet den HTTPS-Server"""
    # Überprüfe, ob Zertifikatsdateien existieren
    if not FULLCHAIN_PATH.exists():
        print(f"Fehler: {FULLCHAIN_PATH} nicht gefunden!")
        print(f"Bitte platziere die fullchain.pem im cert Ordner.")
        return
    
    if not PRIVKEY_PATH.exists():
        print(f"Fehler: {PRIVKEY_PATH} nicht gefunden!")
        print(f"Bitte platziere die privkey.pem im cert Ordner.")
        return

    # HTTP Request Handler
    handler = http.server.SimpleHTTPRequestHandler
    
    # Erstelle Server
    with http.server.HTTPServer(("0.0.0.0", HTTPS_PORT), handler) as httpd:
        # SSL Context erstellen
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        
        # Zertifikate laden
        # fullchain.pem enthält sowohl cert.pem als auch chain.pem
        ssl_context.load_cert_chain(
            certfile=str(FULLCHAIN_PATH),
            keyfile=str(PRIVKEY_PATH)
        )
        
        # SSL auf den Socket anwenden
        httpd.socket = ssl_context.wrap_socket(
            httpd.socket,
            server_side=True
        )
        
        print(f"✓ HTTPS-Server läuft auf https://0.0.0.0:{HTTPS_PORT}")
        print(f"✓ Zertifikat: {FULLCHAIN_PATH}")
        print(f"✓ Private Key: {PRIVKEY_PATH}")
        
        httpd.serve_forever()


def main():
    print("Starte HTTP und HTTPS Server...\n")
    
    # Starte HTTP-Server in separatem Thread
    http_thread = threading.Thread(target=start_http_server, daemon=True)
    http_thread.start()
    
    # Starte HTTPS-Server in separatem Thread
    https_thread = threading.Thread(target=start_https_server, daemon=True)
    https_thread.start()
    
    print(f"\nDrücke Ctrl+C zum Beenden...\n")
    
    try:
        # Hauptthread am Leben halten
        http_thread.join()
        https_thread.join()
    except KeyboardInterrupt:
        print("\n\nServer werden beendet...")


if __name__ == "__main__":
    main()
