#!/usr/bin/env python3
"""Serves the trip page as-is, plus /api/packing for the shared packing list.
No accounts, no third party: state lives in packing_state.json next to this file."""
import http.server
import json
import os
import sys

STATE_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'packing_state.json')
MAX_BODY = 1_000_000  # ponytail: flat cap, revisit if the packing list ever needs real size limits


class Handler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/api/packing':
            data = b'{}'
            if os.path.exists(STATE_FILE):
                with open(STATE_FILE, 'rb') as f:
                    data = f.read()
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Content-Length', str(len(data)))
            self.end_headers()
            self.wfile.write(data)
            return
        super().do_GET()

    def do_PUT(self):
        if self.path != '/api/packing':
            self.send_response(404)
            self.end_headers()
            return
        length = int(self.headers.get('Content-Length', 0))
        if length <= 0 or length > MAX_BODY:
            self.send_response(400)
            self.end_headers()
            return
        body = self.rfile.read(length)
        try:
            json.loads(body)
        except ValueError:
            self.send_response(400)
            self.end_headers()
            return
        with open(STATE_FILE, 'wb') as f:
            f.write(body)
        self.send_response(204)
        self.end_headers()


if __name__ == '__main__':
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8712
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    # bind explicitly to IPv4: default dual-stack resolution left this IPv6-only,
    # which Tailscale Funnel (connects via 127.0.0.1) couldn't reach.
    http.server.test(HandlerClass=Handler, port=port, bind='0.0.0.0')
