#!/usr/bin/env python3
"""myeventwatch MCP server (thin client).

用户自己安装，配置好 API key 后，Claude Desktop / Cursor 等 MCP 客户端
就能直接调用 myeventwatch 的监控能力。所有检查逻辑在云端跑，
这里只是 thin client —— 护城河保留在服务端。

安装：
    # 下载 https://myeventwatch.com/static/mcp/myeventwatch_mcp.py
    pip install mcp

配置（Claude Desktop 的 claude_desktop_config.json）：
    {
      "mcpServers": {
        "myeventwatch": {
          "command": "python",
          "args": ["/path/to/myeventwatch_mcp.py"],
          "env": {
            "MYEVENTWATCH_API_KEY": "ew_...",
            "MYEVENTWATCH_BASE_URL": "https://myeventwatch.com"
          }
        }
      }
    }
"""
import os
import sys
import json
import urllib.request
import urllib.error

BASE_URL = os.environ.get("MYEVENTWATCH_BASE_URL", "https://myeventwatch.com").rstrip("/")
API_KEY = os.environ.get("MYEVENTWATCH_API_KEY", "")


def _call(method, path, data=None):
    req_data = json.dumps(data).encode() if data else None
    req = urllib.request.Request(
        f"{BASE_URL}{path}", data=req_data, method=method,
        headers={"Authorization": f"Bearer {API_KEY}",
                 "Content-Type": "application/json"})
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            return json.loads(r.read().decode())
    except urllib.error.HTTPError as e:
        body = e.read().decode()
        try:
            return {"error": json.loads(body).get("error", body)}
        except Exception:
            return {"error": body}


def main():
    try:
        from mcp.server.fastmcp import FastMCP
        mcp = FastMCP("myeventwatch")
        tool_decorator = mcp.tool()
    except ImportError:
        try:
            from mcp.server.mcpserver import MCPServer
            mcp = MCPServer("myeventwatch")
            tool_decorator = mcp.tool()
        except ImportError:
            print("pip install mcp", file=sys.stderr)
            sys.exit(1)

    if not API_KEY:
        print("MYEVENTWATCH_API_KEY not set", file=sys.stderr)
        sys.exit(1)

    @tool_decorator
    def create_monitor(type: str, name: str, params: dict,
                       interval_minutes: int = 60) -> str:
        """Create a monitoring task. type: website/stock_price/crypto/market/twitter/youtube/rss/reminder."""
        r = _call("POST", "/api/v1/monitors",
                  {"type": type, "name": name, "params": params,
                   "interval_minutes": interval_minutes})
        return json.dumps(r, ensure_ascii=False)

    @tool_decorator
    def list_monitors() -> str:
        """List all monitoring tasks."""
        return json.dumps(_call("GET", "/api/v1/monitors"), ensure_ascii=False)

    @tool_decorator
    def get_events(monitor_id: int, limit: int = 20) -> str:
        """Get recent alert events for a monitor."""
        return json.dumps(
            _call("GET", f"/api/v1/monitors/{monitor_id}/events?limit={limit}"),
            ensure_ascii=False)

    @tool_decorator
    def delete_monitor(monitor_id: int) -> str:
        """Delete a monitoring task."""
        return json.dumps(_call("DELETE", f"/api/v1/monitors/{monitor_id}"),
                          ensure_ascii=False)

    mcp.run()


if __name__ == "__main__":
    main()
