#!/usr/bin/env python3
"""Sell listings server with photo upload support."""

import os
import json
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import parse_qs

PHOTOS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "photos")
os.makedirs(PHOTOS_DIR, exist_ok=True)


class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(
            *args, directory=os.path.dirname(os.path.abspath(__file__)), **kwargs
        )

    def do_POST(self):
        if self.path == "/upload":
            self._handle_upload()
        elif self.path == "/delete-photo":
            self._handle_delete()
        else:
            self.send_error(404)

    def _handle_upload(self):
        content_type = self.headers.get("Content-Type", "")
        if "multipart/form-data" not in content_type:
            self.send_error(400, "Expected multipart/form-data")
            return

        boundary = content_type.split("boundary=")[1].encode()
        content_length = int(self.headers["Content-Length"])
        body = self.rfile.read(content_length)

        parts = body.split(b"--" + boundary)
        slug = None
        file_data = None
        file_ext = "jpg"

        for part in parts:
            if b"Content-Disposition" not in part:
                continue
            header, _, data = part.partition(b"\r\n\r\n")
            data = data.rstrip(b"\r\n--")
            header_str = header.decode("utf-8", errors="replace")

            if 'name="slug"' in header_str:
                slug = data.decode().strip()
            elif 'name="photo"' in header_str:
                file_data = data
                if "filename=" in header_str:
                    fname = header_str.split('filename="')[1].split('"')[0].lower()
                    if fname.endswith(".png"):
                        file_ext = "png"
                    elif fname.endswith(".webp"):
                        file_ext = "webp"
                    elif fname.endswith(".heic"):
                        file_ext = "heic"

        if not slug or not file_data:
            self.send_error(400, "Missing slug or photo")
            return

        # Find next available number
        n = 1
        while True:
            candidate = os.path.join(PHOTOS_DIR, f"{slug}-{n}.{file_ext}")
            if not os.path.exists(candidate):
                break
            n += 1

        with open(candidate, "wb") as f:
            f.write(file_data)

        # Auto-compress large images
        try:
            import subprocess
            size = os.path.getsize(candidate)
            if size > 500_000 and file_ext in ("jpg", "jpeg", "png"):
                subprocess.run(
                    ["convert", candidate, "-resize", "1200x1200>", "-quality", "80", candidate],
                    timeout=30,
                )
        except Exception:
            pass  # serve original if compression fails

        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.end_headers()
        self.wfile.write(
            json.dumps({"ok": True, "file": f"{slug}-{n}.{file_ext}"}).encode()
        )

    def _handle_delete(self):
        content_length = int(self.headers.get("Content-Length", 0))
        body = self.rfile.read(content_length)
        data = json.loads(body)
        filename = os.path.basename(data.get("file", ""))
        filepath = os.path.join(PHOTOS_DIR, filename)

        if os.path.exists(filepath):
            os.remove(filepath)

        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.end_headers()
        self.wfile.write(json.dumps({"ok": True}).encode())

    def do_GET(self):
        if self.path == "/list-photos":
            self._list_photos()
        else:
            super().do_GET()

    def _list_photos(self):
        files = []
        if os.path.isdir(PHOTOS_DIR):
            files = sorted(os.listdir(PHOTOS_DIR))
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.end_headers()
        self.wfile.write(json.dumps(files).encode())


if __name__ == "__main__":
    port = int(os.environ.get("PORT", 10444))
    server = HTTPServer(("0.0.0.0", port), Handler)
    print(f"Sell listings server running on http://127.0.0.1:{port}")
    server.serve_forever()
