import os
import subprocess
from pathlib import Path

from mcp.server.mcpserver import MCPServer

VENV_CB = "/home/oem/CyberBrain26-v4/.venv/bin/cyberbrain"
PROJECT_DIR = "/home/oem/CyberBrain26-v4"
WORKSPACES_ROOT = Path("/srv/cb26-data/workspace/workspaces")

ENV = os.environ.copy()
ENV.setdefault("CYBERBRAIN_DB_PATH", "/srv/cb26-data/workspace/cyberbrain.sqlite3")
ENV.setdefault("CYBERBRAIN_DATA_DIR", "/srv/cb26-data/workspace")
ENV.setdefault("CYBERBRAIN_WORKSPACES_ROOT", str(WORKSPACES_ROOT))

mcp = MCPServer("cyberbrain")


def run_cli(*args: str, timeout: int = 120) -> str:
    result = subprocess.run(
        [VENV_CB, *args],
        cwd=PROJECT_DIR,
        env=ENV,
        capture_output=True,
        text=True,
        timeout=timeout,
    )
    output = (result.stdout or "") + (result.stderr or "")
    return output.strip() or f"exit_code={result.returncode}"


@mcp.tool()
def list_roadmaps() -> str:
    """List CyberBrain roadmaps and their current state."""
    return run_cli("roadmaps", "list")


@mcp.tool()
def pending_approvals() -> str:
    """List pending CyberBrain approval requests."""
    return run_cli("approvals", "pending")


@mcp.tool()
def approve_request(request_id: str) -> str:
    """Approve a pending CyberBrain request by request_id."""
    return run_cli("approvals", "approve", request_id, timeout=30)


@mcp.tool()
def deny_request(request_id: str) -> str:
    """Deny a pending CyberBrain request by request_id."""
    return run_cli("approvals", "deny", request_id, timeout=30)


@mcp.tool()
def run_roadmap(roadmap_id: str, approval_timeout: int = 600) -> str:
    """Start a CyberBrain roadmap by ID using the python scope."""
    return run_cli(
        "run",
        "--id", roadmap_id,
        "--scopes", "python",
        "--approval-timeout", str(approval_timeout),
        timeout=approval_timeout + 30,
    )


@mcp.tool()
def read_workspace_file(relative_path: str) -> str:
    """Read a UTF-8 text file from CyberBrain's persistent workspaces directory."""
    target = (WORKSPACES_ROOT / relative_path).resolve()
    if WORKSPACES_ROOT not in target.parents and target != WORKSPACES_ROOT:
        return "ERROR: path outside CyberBrain workspaces root"
    if not target.is_file():
        return f"ERROR: file not found: {relative_path}"
    return target.read_text(encoding="utf-8")


if __name__ == "__main__":
    mcp.run()
