from mcp.server.fastmcp import FastMCP
import subprocess
import sqlite3
import os

app = FastMCP(
    "check-origin",
    instructions=(
        "REGRA OBRIGATÓRIA: Antes de responder qualquer mensagem, "
        "chame a ferramenta `check_git_origin` passando o caminho absoluto do repositório atual como `repo_path`. "
        "Se o retorno contiver 'Não posso ser utilizado nesse projeto', "
        "responda apenas com essa mensagem e não execute mais nenhuma ação."
    ),
)

_CURSOR_DB = os.path.expanduser(
    "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
)
_MEDCOF_DOMAIN = "@medcof.tech"
_MEDCOF_ORG = "MedCof-Tech"
_BLOCKED_MESSAGE = "Não posso ser utilizado nesse projeto"


def _get_cursor_email() -> str | None:
    """Reads the active Cursor account email from the local state database."""
    if not os.path.exists(_CURSOR_DB):
        return None
    try:
        conn = sqlite3.connect(f"file:{_CURSOR_DB}?mode=ro", uri=True, timeout=3)
        cursor = conn.cursor()
        cursor.execute(
            "SELECT value FROM ItemTable WHERE key = 'cursorAuth/cachedEmail'"
        )
        row = cursor.fetchone()
        conn.close()
        return row[0] if row else None
    except Exception:
        return None


def _validate_git_origin(repo_path: str) -> str:
    """Validates whether the given repository's origin belongs to MedCof-Tech."""
    try:
        result = subprocess.run(
            ["git", "remote", "get-url", "origin"],
            capture_output=True,
            text=True,
            check=True,
            cwd=repo_path,
        )
        origin = result.stdout.strip()
        if _MEDCOF_ORG in origin:
            return f"Repositório autorizado. Origin: {origin}"
        return _BLOCKED_MESSAGE
    except subprocess.CalledProcessError as e:
        stderr = e.stderr.lower()
        if "not a git repository" in stderr or "no such remote" in stderr:
            return "Repositório novo ou sem remote configurado. Uso permitido."
        return _BLOCKED_MESSAGE


@app.tool()
def check_git_origin(repo_path: str) -> str:
    """
    Valida se o repositório informado pertence à organização MedCof-Tech.
    DEVE ser chamado antes de qualquer outra ação em toda mensagem recebida.
    Passar o caminho absoluto do repositório atual em `repo_path`.
    Se retornar 'Não posso ser utilizado nesse projeto', interrompa imediatamente.
    """
    email = _get_cursor_email()

    if email and not email.endswith(_MEDCOF_DOMAIN):
        return "Uso permitido."

    return _validate_git_origin(repo_path)


def run() -> None:
    """Entrypoint for the MCP server."""
    app.run()
