import sys
import os
from pathlib import Path

# Garante que o diretorio do servidor esta no path
_server_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, _server_dir)

from mcp.server.fastmcp import FastMCP
from config import has_oauth_credentials, FLUIG_SERVER, FLUIG_VERIFY_SSL

# Dev Tools
from tools.dev import scanner, scaffold, validators, knowledge, skills_installer

_transport = os.environ.get("MCP_TRANSPORT", "stdio").lower()
_host = os.environ.get("MCP_HOST", "0.0.0.0")
_port = int(os.environ.get("MCP_PORT", "3000"))

mcp = FastMCP(
    "fluig-dev-mcp",
    instructions=(
        "Servidor MCP para desenvolvimento Fluig. "
        "Fornece ferramentas de geracao de codigo (scaffold), validacao e conhecimento do Style Guide. "
        "Fase 1: Dev Tools (sem necessidade de credenciais OAuth). "
        "Fase 2+: API REST do Fluig (requer .env configurado)."
    ),
    host=_host,
    port=_port,
)

# Registrar Dev Tools (Fase 1)
scanner.register(mcp)
scaffold.register(mcp)
validators.register(mcp)
knowledge.register(mcp)
skills_installer.register(mcp)

# ── Tool de diagnostico (sempre disponivel) ──────────────────────────────────
@mcp.tool()
async def fluig_conexao_testar() -> str:
    """
    Testa a conexao com o servidor Fluig usando as credenciais do .env.
    Retorna diagnostico completo: status do .env, SSL, e resultado da chamada HTTP.
    """
    import json as _json
    _env_local = Path(_server_dir) / ".env"
    _env_home = Path.home() / ".fluig-mcp" / ".env"
    diagnostico = {
        "env_path_local": str(_env_local),
        "env_local_existe": _env_local.exists(),
        "env_path_home": str(_env_home),
        "env_home_existe": _env_home.exists(),
        "servidor": FLUIG_SERVER or "(vazio)",
        "credenciais_configuradas": has_oauth_credentials(),
        "verify_ssl": FLUIG_VERIFY_SSL,
    }

    if not has_oauth_credentials():
        diagnostico["status"] = "ERRO"
        diagnostico["mensagem"] = (
            "Credenciais OAuth nao configuradas. "
            "Execute 'npx @fs-fluigexperts/fluig-mcp' para configurar o .env."
        )
        return _json.dumps(diagnostico, ensure_ascii=False, indent=2)

    # Testar chamada real
    try:
        from http_client import fluig_get
        resultado = await fluig_get("/api/v2/datasets", {"pageSize": 1})
        try:
            dados = _json.loads(resultado)
            if isinstance(dados, dict) and "status" not in dados:
                diagnostico["status"] = "OK"
                diagnostico["mensagem"] = "Conexao estabelecida com sucesso."
                diagnostico["resposta_preview"] = str(resultado)[:200]
            elif isinstance(dados, dict) and dados.get("status") == "sucesso":
                diagnostico["status"] = "OK"
                diagnostico["mensagem"] = "Conexao estabelecida com sucesso."
            else:
                diagnostico["status"] = "OK"
                diagnostico["mensagem"] = "Conexao estabelecida."
                diagnostico["resposta_preview"] = str(resultado)[:200]
        except (_json.JSONDecodeError, ValueError):
            if "Erro" in resultado:
                diagnostico["status"] = "ERRO"
                diagnostico["mensagem"] = resultado
            else:
                diagnostico["status"] = "OK"
                diagnostico["mensagem"] = "Resposta recebida do servidor."
                diagnostico["resposta_preview"] = resultado[:200]
    except Exception as e:
        diagnostico["status"] = "ERRO"
        diagnostico["mensagem"] = f"Excecao: {str(e)}"

    return _json.dumps(diagnostico, ensure_ascii=False, indent=2)


# Registrar API Tools (Fases 2-5) — apenas se credenciais configuradas
if has_oauth_credentials():
    _ssl_status = "verificacao SSL ativa" if FLUIG_VERIFY_SSL else "verificacao SSL desativada"
    print(f"Credenciais OAuth detectadas — carregando API Tools... ({FLUIG_SERVER}, {_ssl_status})", file=sys.stderr)

    # Fase 2 — Core
    from tools.api import datasets, documents, workflows, users
    datasets.register(mcp)
    documents.register(mcp)
    workflows.register(mcp)
    users.register(mcp)

    # Fase 3 — Extended
    from tools.api import cards, alerts, search, groups, forms
    cards.register(mcp)
    alerts.register(mcp)
    search.register(mcp)
    groups.register(mcp)
    forms.register(mcp)

    # Fase 4 — Social
    from tools.api import social
    social.register(mcp)

    # Fase 5 — Admin
    from tools.api import admin
    admin.register(mcp)

else:
    _env_file = Path(_server_dir) / ".env"
    _env_exists = _env_file.exists()
    print(
        f"AVISO: Credenciais OAuth nao configuradas. "
        f"Apenas Dev Tools disponiveis. "
        f".env {'encontrado' if _env_exists else 'NAO encontrado'} em: {_env_file} — "
        f"Execute 'npx @fs-fluigexperts/fluig-mcp' para configurar.",
        file=sys.stderr,
    )


if __name__ == "__main__":
    if _transport == "sse":
        print(f"Iniciando servidor MCP via SSE em {_host}:{_port}", file=sys.stderr)
        mcp.run(transport="sse")
    else:
        mcp.run(transport="stdio")
