import http.server
import os
import posixpath
import ssl
import urllib.parse


class UAPrefixRoutingHandler(http.server.SimpleHTTPRequestHandler):
    # Match on the first N characters of User-Agent.
    UA_PREFIX_LEN = 5

    # Edit this map as needed: prefix -> subdirectory.
    UA_DIR_MAP = {
        "Mozil": "site_mozilla",
        "curl/": "site_curl",
    }
    DEFAULT_SUBDIR = "site_default"

    def _selected_subdir(self):
        user_agent = self.headers.get("User-Agent", "")
        prefix = user_agent[: self.UA_PREFIX_LEN]
        return self.UA_DIR_MAP.get(prefix, self.DEFAULT_SUBDIR)

    def translate_path(self, path):
        # Same idea as SimpleHTTPRequestHandler.translate_path, but rooted
        # in a user-agent-specific subdirectory.
        path = path.split("?", 1)[0]
        path = path.split("#", 1)[0]
        trailing_slash = path.endswith("/")
        path = posixpath.normpath(urllib.parse.unquote(path))
        parts = [part for part in path.split("/") if part]

        translated = os.path.join(os.getcwd(), self._selected_subdir())
        for part in parts:
            part = os.path.basename(part)
            if part in (os.curdir, os.pardir):
                continue
            translated = os.path.join(translated, part)

        if trailing_slash:
            translated += "/"
        return translated

    def log_request(self, code="-", size="-"):
        super().log_request(code, size)
        try:
            status_code = int(code)
        except (TypeError, ValueError):
            return

        if 200 <= status_code < 300:
            user_agent = self.headers.get("User-Agent", "")
            print(f"Successful request User-Agent: {user_agent}", flush=True)

# Define server address and handler
server_address = ('0.0.0.0', 443)
handler = UAPrefixRoutingHandler

# Create the HTTP server
httpd = http.server.HTTPServer(server_address, handler)

# Set up SSL context (modern way)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='fullchain.crt', keyfile='privkey.key')

# Wrap the socket
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)

print("Serving on port 443")
httpd.serve_forever()
