#!/usr/bin/env python3
"""
api-server.py — Threaded HTTP API server for JARVIS Command Center
Serves live data from collect-data.py as JSON to the Next.js frontend.

Port: 3004
Endpoints:
  GET /api/v1/data     → Full data payload
  GET /api/v1/refresh  → Trigger data collection, return fresh data
  GET /api/v1/health   → {"status": "ok", "timestamp": "..."}
"""

import json
import os
import subprocess
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn
from urllib.parse import urlparse

DATA_FILE = "/root/jarvis-dashboard/data/live/data.json"
SCRIPT_DIR = "/root/jarvis-dashboard/scripts"
PORT = 3005


def get_data():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE) as f:
            return json.load(f)
    return {}


def refresh_data():
    try:
        result = subprocess.run(
            ["python3", os.path.join(SCRIPT_DIR, "collect-data.py")],
            capture_output=True, text=True, timeout=60
        )
        if result.returncode == 0:
            return get_data()
    except Exception as e:
        print(f"Data refresh failed: {e}")
    return get_data()


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)

        if parsed.path == "/api/v1/data":
            data = get_data()
            self._send_json(200, data)

        elif parsed.path == "/api/v1/refresh":
            data = refresh_data()
            self._send_json(200, {"status": "ok", "data": data})

        elif parsed.path == "/api/v1/health":
            self._send_json(200, {
                "status": "ok",
                "timestamp": datetime.now().isoformat()
            })

        else:
            self.send_response(404)
            self.end_headers()

    def _send_json(self, status, data):
        body = json.dumps(data, default=str).encode("utf-8")
        self.send_response(status)
        self.send_header("Content-Type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Cache-Control", "no-cache")
        self.send_header("Content-Length", str(len(body)))
        self.end_headers()
        self.wfile.write(body)

    def log_message(self, format, *args):
        pass


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    daemon_threads = True


def main():
    server = ThreadedHTTPServer(("127.0.0.1", PORT), Handler)
    print(f"JARVIS Command Center API running on port {PORT}")
    server.serve_forever()


if __name__ == "__main__":
    main()
