#!/usr/bin/env python3
"""
판도라 인텔리전스 — Claude Desktop용 MCP stdio 프록시.
Python 표준 라이브러리만 사용 — 추가 패키지 설치 불필요.
python3만 있으면 됩니다 (macOS 기본 내장).

환경변수:
  PANDORA_SERVER_URL  판도라 서버 URL  (기본: http://localhost:8000)
  PANDORA_API_KEY     사용자 개인 API 키 (관리자 페이지에서 발급)

Claude Desktop 설정 예시 (claude_desktop_config.json):
  {
    "mcpServers": {
      "pandora-intelligence": {
        "command": "python3",
        "args": ["/path/to/mcp_proxy.py"],
        "env": {
          "PANDORA_SERVER_URL": "https://pi.pandora.tv",
          "PANDORA_API_KEY": "여기에_API_키"
        }
      }
    }
  }
"""

import json
import os
import ssl
import sys
import urllib.request
import urllib.error

SERVER_URL = os.environ.get("PANDORA_SERVER_URL", "http://localhost:8000").rstrip("/")
API_KEY    = os.environ.get("PANDORA_API_KEY", "")


def _make_ssl_context() -> ssl.SSLContext | None:
    """certifi가 설치되어 있으면 해당 CA 번들 사용, 없으면 시스템 기본값."""
    try:
        import certifi
        return ssl.create_default_context(cafile=certifi.where())
    except ImportError:
        return ssl.create_default_context()

_SSL_CTX = _make_ssl_context()


def _post(payload: dict) -> dict | None:
    """판도라 서버 /mcp 엔드포인트에 JSON-RPC 메시지 전달."""
    data = json.dumps(payload).encode()
    req  = urllib.request.Request(
        f"{SERVER_URL}/mcp",
        data=data,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {API_KEY}",
            "Accept": "application/json",
        },
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=120, context=_SSL_CTX) as resp:
            body = resp.read()
            return json.loads(body) if body else None
    except urllib.error.HTTPError as e:
        body = e.read()
        try:
            return json.loads(body)
        except Exception:
            return _err(payload.get("id"), f"HTTP {e.code}: {body.decode(errors='replace')}")
    except Exception as e:
        return _err(payload.get("id"), str(e))


def _err(msg_id, message: str) -> dict:
    return {"jsonrpc": "2.0", "id": msg_id, "error": {"code": -32603, "message": message}}


def _write(msg: dict):
    line = json.dumps(msg, ensure_ascii=False) + "\n"
    sys.stdout.buffer.write(line.encode())
    sys.stdout.buffer.flush()


def main():
    if not API_KEY:
        print("[pandora-proxy] 경고: PANDORA_API_KEY가 없습니다.", file=sys.stderr)

    for raw in sys.stdin.buffer:
        raw = raw.strip()
        if not raw:
            continue
        try:
            msg = json.loads(raw)
        except json.JSONDecodeError:
            continue

        # Notification (id 없음) — 응답 불필요
        if "id" not in msg:
            _post(msg)
            continue

        resp = _post(msg)
        if resp:
            _write(resp)


if __name__ == "__main__":
    main()
