#!/usr/bin/env python3
"""
LogicFrame MCP Server - STDIO Bridge
Proxies stdio JSON-RPC to Hetzner MCP HTTP server (port 8423)
"""
import sys
import json
import os
from urllib.request import urlopen, Request
from urllib.error import HTTPError

MEMORY_SERVER = os.getenv("MEMORY_SERVER_URL", "http://5.78.202.35:8423")
API_KEY = os.getenv("LOGICFRAME_API_KEY", "")

def http_rpc(path, payload=None):
    """Make HTTP POST to MCP server endpoint"""
    data = json.dumps(payload).encode() if payload is not None else b'{}'
    headers = {"Content-Type": "application/json"}
    if API_KEY:
        headers["Authorization"] = f"Bearer {API_KEY}"
    
    url = f"{MEMORY_SERVER.rstrip('/')}/{path}"
    req = Request(url, data=data, headers=headers, method="POST")
    
    try:
        with urlopen(req, timeout=30) as resp:
            return json.loads(resp.read().decode())
    except HTTPError as e:
        body = e.read().decode() if e.fp else ""
        return {"error": f"HTTP {e.code}", "body": body}
    except Exception as e:
        return {"error": str(e)}

def handle_stdio():
    cap = {"tools": {}}
    
    # Send protocol handshake on startup
    sys.stdout.write(json.dumps({
        "jsonrpc": "2.0", "id": 0,
        "result": {
            "protocolVersion": "2024-11-05",
            "capabilities": cap,
            "serverInfo": {"name": "logicframe-mcp", "version": "2.0.0"}
        }
    }) + "\n")
    sys.stdout.flush()
    
    for line in sys.stdin:
        line = line.strip()
        if not line:
            continue
        try:
            req = json.loads(line)
            method = req.get("method", "")
            params = req.get("params", {})
            req_id = req.get("id")
            
            if method == "initialize":
                resp = {"jsonrpc": "2.0", "id": req_id, "result": {
                    "protocolVersion": "2024-11-05",
                    "capabilities": cap,
                    "serverInfo": {"name": "logicframe-mcp", "version": "2.0.0"}
                }}
            elif method == "tools/list":
                result = http_rpc("tools/list", {"method": "tools/list", "params": params})
                # HTTP server returns {"tools": [...]} directly
                resp = {"jsonrpc": "2.0", "id": req_id, "result": {"tools": result.get("tools", [])}}
            elif method == "tools/call":
                name = params.get("name", "")
                arguments = params.get("arguments", {})
                result = http_rpc("tools/call", {
                    "method": "tools/call",
                    "params": {"name": name, "arguments": arguments}
                })
                resp = {"jsonrpc": "2.0", "id": req_id, "result": result}
            elif method == "ping":
                resp = {"jsonrpc": "2.0", "id": req_id, "result": {}}
            else:
                resp = {"jsonrpc": "2.0", "id": req_id, "error": f"Unknown method: {method}"}
            
            sys.stdout.write(json.dumps(resp) + "\n")
            sys.stdout.flush()
        except Exception as e:
            err = {"jsonrpc": "2.0", "id": None, "error": str(e)}
            sys.stdout.write(json.dumps(err) + "\n")
            sys.stdout.flush()

if __name__ == "__main__":
    handle_stdio()
