import json
import os
from mcp.server.fastmcp import FastMCP

_BASE = os.path.join(os.path.dirname(__file__), "..", "..", "knowledge")


def _load(filename: str) -> dict:
    path = os.path.join(_BASE, filename)
    with open(path, "r", encoding="utf-8") as f:
        return json.load(f)


def register(mcp: FastMCP):

    @mcp.tool()
    def fluig_get_componente_style(nome: str) -> str:
        """
        Retorna o HTML de exemplo e a descrição de um componente do Style Guide do Fluig.
        Use quando precisar saber como implementar um componente (panel, modal, input, select,
        table, tabs, datepicker, autocomplete, attachment, checkbox, radio, toast, etc.).

        Args:
            nome: Nome do componente. Ex: 'panel', 'modal', 'autocomplete', 'attachment', 'date', 'tabs'.
        """
        data = _load("style_guide.json")
        nome_lower = nome.lower().strip()

        for comp in data.get("components", []):
            if comp["name"].lower() == nome_lower or nome_lower in comp["name"].lower():
                resultado = {
                    "nome": comp["name"],
                    "descricao": comp.get("description", ""),
                    "html": comp.get("html", ""),
                }
                if "js" in comp:
                    resultado["js"] = comp["js"]
                if "variants" in comp:
                    resultado["variantes"] = comp["variants"]
                if "note" in comp:
                    resultado["nota"] = comp["note"]
                return json.dumps(resultado, ensure_ascii=False, indent=2)

        disponiveis = [c["name"] for c in data.get("components", [])]
        return f"Componente '{nome}' não encontrado.\nDisponíveis: {', '.join(disponiveis)}"

    @mcp.tool()
    def fluig_get_fluigc(nome: str) -> str:
        """
        Retorna documentação completa de um componente FLUIGC com HTML e atributos.
        Use para fluig-lookup, fluig-form-attachment, fluig-calendar, fluig-select2,
        fluig-mask, fluig-tooltip, fluig-collapse, fluig-badge, fluig-progress.

        Args:
            nome: Nome do componente FLUIGC. Ex: 'fluig-lookup', 'fluig-mask', 'fluig-calendar'.
        """
        data = _load("fluigc_components.json")
        nome_lower = nome.lower().strip()

        for comp in data.get("components", []):
            if comp["name"].lower() == nome_lower or nome_lower in comp["name"].lower():
                return json.dumps(comp, ensure_ascii=False, indent=2)

        disponiveis = [c["name"] for c in data.get("components", [])]
        return f"Componente FLUIGC '{nome}' não encontrado.\nDisponíveis: {', '.join(disponiveis)}"

    @mcp.tool()
    def fluig_get_sdk_ref(servico: str) -> str:
        """
        Retorna a referência do SDK Fluig para um serviço específico com métodos e exemplos de uso.
        Use quando precisar usar um serviço server-side em eventos ou datasets.

        Args:
            servico: Nome do serviço. Ex: 'WorkflowAPIService', 'GedAPI', 'ColleagueService',
                     'DatasetFactory', 'ConstraintFactory', 'CardAPIService', 'AlertService'.
        """
        data = _load("sdk_reference.json")
        servico_lower = servico.lower().strip()

        for svc in data.get("services", []):
            if svc["name"].lower() == servico_lower or servico_lower in svc["name"].lower():
                return json.dumps(svc, ensure_ascii=False, indent=2)

        disponiveis = [s["name"] for s in data.get("services", [])]
        return f"Serviço '{servico}' não encontrado.\nDisponíveis: {', '.join(disponiveis)}"

    @mcp.tool()
    def fluig_get_eventos_globais(contexto: str = "todos") -> str:
        """
        Lista todos os eventos disponíveis no Fluig com assinaturas e descrições.
        Use para saber quais eventos existem e como implementá-los.

        Args:
            contexto: Filtro de contexto. Opções: 'workflow', 'form', 'global', 'todos'.
        """
        data = _load("events_reference.json")
        contexto_lower = contexto.lower().strip()

        resultado = {}

        if contexto_lower in ("workflow", "todos"):
            resultado["workflow_events"] = data.get("workflow_events", [])
        if contexto_lower in ("form", "todos"):
            resultado["form_events"] = data.get("form_events", [])
        if contexto_lower in ("global", "todos"):
            resultado["global_events"] = data.get("global_events", [])

        if not resultado:
            return f"Contexto '{contexto}' inválido. Use: workflow, form, global ou todos."

        return json.dumps(resultado, ensure_ascii=False, indent=2)

    @mcp.tool()
    def fluig_get_js_plugin(nome: str) -> str:
        """
        Retorna documentacao completa de um plugin JavaScript FLUIGC com exemplos de uso.
        Use para FLUIGC.autocomplete, FLUIGC.calendar, FLUIGC.datatable, FLUIGC.filter,
        FLUIGC.message, FLUIGC.toast, FLUIGC.modal, FLUIGC.collapse, FLUIGC.loading,
        FLUIGC.continuousScroll, SuperWidget, REST Integration.

        Args:
            nome: Nome do plugin. Ex: 'autocomplete', 'datatable', 'modal', 'toast', 'SuperWidget'.
        """
        data = _load("js_plugins.json")
        nome_lower = nome.lower().strip()

        for plugin in data.get("plugins", []):
            if plugin["name"].lower() == nome_lower or nome_lower in plugin["name"].lower():
                return json.dumps(plugin, ensure_ascii=False, indent=2)

        disponiveis = [p["name"] for p in data.get("plugins", [])]
        return f"Plugin '{nome}' nao encontrado.\nDisponiveis: {', '.join(disponiveis)}"

    @mcp.tool()
    def fluig_get_imports_obrigatorios() -> str:
        """
        Retorna os imports CSS e JS obrigatórios para formulários Fluig e o wrapper correto.
        Use ao criar ou validar qualquer formulário HTML Fluig.
        """
        data = _load("style_guide.json")
        imports = data.get("required_imports", {})
        wrapper = data.get("form_wrapper", {})
        return json.dumps({
            "imports_css": imports.get("css", []),
            "imports_js": imports.get("js", []),
            "descricao": imports.get("description", ""),
            "wrapper": wrapper.get("html", ""),
            "wrapper_descricao": wrapper.get("description", ""),
        }, ensure_ascii=False, indent=2)
