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

KNOWN_MODULES = {
    "datasets": "Datasets customizados (JS/Java)",
    "events": "Eventos globais da plataforma",
    "forms": "Formulários HTML dos processos",
    "mechanisms": "Mecanismos de delegação BPM",
    "reports": "Relatórios",
    "wcm": "Widgets e layouts WCM",
    "workflow": "Diagramas e scripts de processo",
}


def register(mcp: FastMCP):

    @mcp.tool()
    def fluig_scan_projeto(caminho: str) -> str:
        """
        Escaneia a estrutura de um projeto Fluig/Eclipse e retorna um mapa completo dos módulos,
        arquivos encontrados e resumo. Use antes de gerar ou validar código para entender o projeto.

        Args:
            caminho: Caminho absoluto da pasta raiz do projeto Fluig/Eclipse.
        """
        if not os.path.isdir(caminho):
            return f"Pasta não encontrada: {caminho}"

        resultado = {
            "raiz": caminho,
            "modulos_encontrados": [],
            "modulos_ausentes": [],
            "detalhe": {},
        }

        for modulo, descricao in KNOWN_MODULES.items():
            mod_path = os.path.join(caminho, modulo)
            if os.path.isdir(mod_path):
                arquivos = _listar_arquivos(mod_path)
                resultado["modulos_encontrados"].append(modulo)
                resultado["detalhe"][modulo] = {
                    "descricao": descricao,
                    "caminho": mod_path,
                    "total_arquivos": len(arquivos),
                    "arquivos": arquivos,
                }
                if modulo == "forms":
                    resultado["detalhe"][modulo]["processos"] = _listar_processos(mod_path)
                if modulo == "wcm":
                    resultado["detalhe"][modulo]["widgets"] = _listar_widgets(mod_path)
                if modulo == "workflow":
                    resultado["detalhe"][modulo]["scripts"] = _listar_workflow_scripts(mod_path)
            else:
                resultado["modulos_ausentes"].append(modulo)

        resultado["resumo"] = (
            f"{len(resultado['modulos_encontrados'])} módulos encontrados: "
            + ", ".join(resultado["modulos_encontrados"])
        )

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


def _listar_arquivos(pasta: str, extensoes: tuple = (".js", ".html", ".ftl", ".json", ".xml")) -> list:
    arquivos = []
    for root, _, files in os.walk(pasta):
        for f in files:
            if f.endswith(extensoes):
                rel = os.path.relpath(os.path.join(root, f), pasta)
                arquivos.append(rel)
    return sorted(arquivos)


def _listar_processos(forms_path: str) -> list:
    processos = []
    for item in os.listdir(forms_path):
        item_path = os.path.join(forms_path, item)
        if os.path.isdir(item_path):
            html_files = [f for f in os.listdir(item_path) if f.endswith(".html")]
            events_path = os.path.join(item_path, "events")
            events = []
            if os.path.isdir(events_path):
                events = [f for f in os.listdir(events_path) if f.endswith(".js")]
            processos.append({
                "nome": item,
                "formularios": html_files,
                "eventos": events,
            })
    return processos


def _listar_widgets(wcm_path: str) -> list:
    widgets = []
    widget_path = os.path.join(wcm_path, "widget")
    if not os.path.isdir(widget_path):
        return widgets
    for item in os.listdir(widget_path):
        item_path = os.path.join(widget_path, item)
        if os.path.isdir(item_path):
            arquivos = os.listdir(item_path)
            widgets.append({
                "nome": item,
                "arquivos": sorted(arquivos),
            })
    return widgets


def _listar_workflow_scripts(workflow_path: str) -> list:
    scripts_path = os.path.join(workflow_path, "scripts")
    if not os.path.isdir(scripts_path):
        return []
    return sorted([f for f in os.listdir(scripts_path) if f.endswith(".js")])
