import http.server
import os
import urllib.parse

class SimpleFileServerHandler(http.server.SimpleHTTPRequestHandler):
    def list_directory(self, path):
        """Override to allow directory listing with links to files and folders."""
        try:
            list_dir = os.listdir(path)
        except OSError:
            self.send_error(403, "Cannot list directory")
            return None

        list_dir.sort(key=lambda name: (not os.path.isdir(os.path.join(path, name)), name.lower()))
        displaypath = urllib.parse.unquote(self.path)
        f = []
        f.append("<html><head>")
        f.append("<meta charset='utf-8'>")        
        f.append("""
            <style>
                body { font-family: sans-serif; }
                a { text-decoration: none; color: #0645AD; }
                a:hover { text-decoration: underline; }
            </style>
        """)
        f.append(f"<title>Verzeichnis {displaypath}</title></head>")
        f.append(f"<body><h2>Verzeichnis {displaypath}</h2>")
        f.append(' [xxx]: Unterverzeichnis, &dArr;xxx&dArr; : Datei zum herunterladen (wobei .MOBI sicher funktioniert)')
        f.append('<ul>')

        # Add parent directory link
        if displaypath != "/":
            parent = os.path.dirname(displaypath.rstrip("/"))
            f.append(f'<li><a href="{urllib.parse.quote(parent) or "/"}"><i>&larr;</i></a></li>')

        # Extensions to mark with book icon
        ebook_exts = {'.azw', '.azw3', '.mobi', '.epub'}
        
        for name in list_dir:
            fullname = os.path.join(path, name)
            is_dir = os.path.isdir(fullname)
            ext = os.path.splitext(name)[1].lower()
            #icon = "📁" if  is_dir  else ("📘 " if ext in ebook_exts else "")
            display_name = f"[{name}]" if is_dir else (f"&dArr;{name}&dArr;"  if ext in ebook_exts else name)
            linkname = urllib.parse.quote(os.path.join(displaypath, name))
            f.append(f'<li><a href="{linkname}">{display_name}</a></li>')

        f.append("</ul></body></html>")
        encoded = "\n".join(f).encode("utf-8", "surrogateescape")
        self.send_response(200)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.send_header("Content-Length", str(len(encoded)))
        self.end_headers()
        self.wfile.write(encoded)

def run(server_class=http.server.HTTPServer, handler_class=SimpleFileServerHandler, port=8000):
    server_address = ("", port)
    httpd = server_class(server_address, handler_class)
    print(f"Serving on http://localhost:{port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()
