"""Fase 3 — API Tools: Form Management (v2)"""
import json
from urllib.parse import quote as urlquote
from mcp.server.fastmcp import FastMCP
from http_client import fluig_get, fluig_post, fluig_put, fluig_delete


def register(mcp: FastMCP):

    # ── FORMULARIOS ─────────────────────────────────────────────

    @mcp.tool()
    async def fluig_form_listar(
        pagina: int = 0,
        tamanho: int = 20,
        ordem: str = "",
    ) -> str:
        """
        Lista os formularios cadastrados no Fluig.

        Args:
            pagina: Pagina de resultados (comeca em 0).
            tamanho: Itens por pagina.
            ordem: Campo de ordenacao.
        """
        params: dict = {"page": pagina, "pageSize": tamanho}
        if ordem:
            params["order"] = ordem
        return await fluig_get("/api/v2/forms", params)

    @mcp.tool()
    async def fluig_form_criar(body_json: str) -> str:
        """
        Cria um novo formulario no Fluig.

        Args:
            body_json: JSON object com dados do formulario (code, description, fields, etc.).
        """
        try:
            body = json.loads(body_json)
        except json.JSONDecodeError as e:
            return f"Erro: body_json invalido - {e}"
        return await fluig_post("/api/v2/forms", body)

    @mcp.tool()
    async def fluig_form_salvar_draft(
        codigo: str,
        body_json: str,
    ) -> str:
        """
        Salva um rascunho (draft) de formulario.

        Args:
            codigo: Codigo do formulario.
            body_json: JSON object com os dados do formulario.
        """
        try:
            body = json.loads(body_json)
        except json.JSONDecodeError as e:
            return f"Erro: body_json invalido - {e}"
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_put(f"/api/v2/forms/{safe_code}", body)

    @mcp.tool()
    async def fluig_form_publicar(codigo: str) -> str:
        """
        Publica um formulario (transforma draft em versao ativa).

        Args:
            codigo: Codigo do formulario a publicar.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_post(f"/api/v2/forms/{safe_code}/publish")

    @mcp.tool()
    async def fluig_form_componentes(codigo: str) -> str:
        """
        Retorna os campos/componentes de um formulario.

        Args:
            codigo: Codigo do formulario.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_get(f"/api/v2/forms/{safe_code}/components")

    @mcp.tool()
    async def fluig_form_versoes(codigo: str) -> str:
        """
        Lista as versoes de um formulario.

        Args:
            codigo: Codigo do formulario.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_get(f"/api/v2/forms/{safe_code}/versions")

    @mcp.tool()
    async def fluig_form_por_atividade(
        codigo: str,
        atividade_id: int,
    ) -> str:
        """
        Retorna o formulario configurado para uma atividade especifica de processo.

        Args:
            codigo: Codigo do formulario.
            atividade_id: ID da atividade do processo.
        """
        safe_code = urlquote(str(codigo), safe="")
        safe_act = urlquote(str(atividade_id), safe="")
        return await fluig_get(f"/api/v2/forms/{safe_code}/activity/{safe_act}")
