#!/usr/bin/env python3
"""Baby Checklist Sync Server - serves static HTML + JSON state API."""
import json, os, time
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse

STATE_FILE = os.path.join(os.path.dirname(__file__), "state.json")
PUBLIC_DIR = os.path.join(os.path.dirname(__file__), "public")

DEFAULT_STATE = {
    "items": {},
    "selections": {"pediatra": None, "tacho": None, "camara": None},
    "lastUpdated": None,
    "updatedBy": None,
}


def load_state():
    try:
        with open(STATE_FILE) as f:
            return json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        return dict(DEFAULT_STATE)


def save_state(state):
    state["lastUpdated"] = time.time()
    with open(STATE_FILE, "w") as f:
        json.dump(state, f, indent=2)


class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=PUBLIC_DIR, **kwargs)

    def do_GET(self):
        parsed = urlparse(self.path)
        if parsed.path == "/api/state":
            state = load_state()
            self._json_response(state)
            return
        super().do_GET()

    def do_POST(self):
        parsed = urlparse(self.path)
        if parsed.path == "/api/state":
            length = int(self.headers.get("Content-Length", 0))
            body = self.rfile.read(length)
            try:
                data = json.loads(body)
                state = load_state()
                state["items"] = data.get("items", state["items"])
                if "selections" in data:
                    state.setdefault("selections", {})
                    state["selections"].update(data["selections"])
                if "states" in data:
                    state.setdefault("states", {})
                    for k, v in data["states"].items():
                        if k not in state["states"]: state["states"][k] = {}
                        state["states"][k].update(v)
                state["updatedBy"] = data.get("updatedBy", "anon")
                save_state(state)
                self._json_response({"ok": True, "state": state})
            except json.JSONDecodeError:
                self._json_response({"ok": False, "error": "invalid json"}, 400)
            return
        self.send_response(404)
        self.end_headers()

    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")
        self.end_headers()

    def _json_response(self, data, code=200):
        self.send_response(code)
        self.send_header("Content-Type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Cache-Control", "no-cache")
        self.end_headers()
        self.wfile.write(json.dumps(data).encode())

    def end_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        super().end_headers()


if __name__ == "__main__":
    port = int(os.environ.get("PORT", 3005))
    server = HTTPServer(("0.0.0.0", port), Handler)
    print(f"🌸 Baby Checklist running on http://0.0.0.0:{port}")
    server.serve_forever()
