#!/usr/bin/env python3
"""
Harvestree uplink consumer — HTTP webhook (ChirpStack v4).

Accept POST JSON uplink events and print normalized metrics.
Use when your LNS pushes directly to your service URL (simple ingress,
serverless functions, or a single integration endpoint).

See ../README.md for when to pick MQTT vs HTTP or Python vs Node.js.

Env:
  HTTP_HOST (default 0.0.0.0)
  HTTP_PORT (default 8080)
  HTTP_PATH (default /webhook/chirpstack/up)
"""

from __future__ import annotations

import json
import os
from http.server import BaseHTTPRequestHandler, HTTPServer

from ingest_common import print_batch, process_envelope


class WebhookHandler(BaseHTTPRequestHandler):
    expected_path: str = "/webhook/chirpstack/up"

    def do_POST(self) -> None:
        if self.path != self.expected_path:
            self.send_response(404)
            self.end_headers()
            return

        length = int(self.headers.get("Content-Length", "0"))
        body = self.rfile.read(length)
        try:
            envelope = json.loads(body.decode("utf-8"))
        except (UnicodeDecodeError, json.JSONDecodeError):
            self.send_response(400)
            self.end_headers()
            return

        batch = process_envelope(envelope)
        if batch:
            print_batch(batch)

        self.send_response(200)
        self.end_headers()

    def log_message(self, fmt: str, *args) -> None:
        return


def main() -> None:
    host = os.environ.get("HTTP_HOST", "0.0.0.0")
    port = int(os.environ.get("HTTP_PORT", "8080"))
    path = os.environ.get("HTTP_PATH", "/webhook/chirpstack/up")

    WebhookHandler.expected_path = path
    server = HTTPServer((host, port), WebhookHandler)
    print(f"HTTP webhook listening on http://{host}:{port}{path}")
    server.serve_forever()


if __name__ == "__main__":
    main()
