from http.server import BaseHTTPRequestHandler, HTTPServer
import os

UPLOAD_DIR = "/var/www/clouds.topmarinegear.com/uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)


class Handler(BaseHTTPRequestHandler):

    protocol_version = "HTTP/1.1"

    def do_POST(self):
        self.handle_bits()

    def do_PUT(self):
        self.handle_bits()

    def handle_bits(self):

        filename = self.path.strip("/")

        if not filename.lower().endswith(".rar"):
            self.send_response(400)
            self.end_headers()
            self.wfile.write(b"Only .rar files allowed")
            return

        try:
            length = int(self.headers.get('Content-Length', 0))
            remaining = length

            path = os.path.join(UPLOAD_DIR, filename)

            header = self.rfile.read(4)
            remaining -= 4

            if not header.startswith(b"Rar"):
                self.send_response(400)
                self.end_headers()
                self.wfile.write(b"Invalid RAR file")
                return

            with open(path, "wb") as f:

                # ?????????? header
                f.write(header)

                # ?????????? ?????
                while remaining > 0:
                    chunk = self.rfile.read(min(8192, remaining))
                    if not chunk:
                        break
                    f.write(chunk)
                    remaining -= len(chunk)

            # success response
            body = b"OK"

            self.send_response(200)
            self.send_header("Content-Type", "text/plain")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)

            print("Saved:", filename)

        except Exception as e:
            self.send_response(500)
            self.end_headers()
            self.wfile.write(b"Server error")
            print("ERROR:", e)


if __name__ == "__main__":
    server = HTTPServer(("0.0.0.0", 8083), Handler)
    server.serve_forever()