"""API Tools: Grupos (v1)"""
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):

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

        Args:
            descricao: Filtrar por descricao.
            pagina: Pagina de resultados.
            tamanho: Grupos por pagina.
            ordem: Campo de ordenacao.
        """
        params: dict = {"page": pagina, "pageSize": tamanho}
        if descricao:
            params["description"] = descricao
        if ordem:
            params["order"] = ordem
        return await fluig_get("/api/v1/groups", params)

    @mcp.tool()
    async def fluig_grupo_criar(grupo_json: str) -> str:
        """
        Cria um novo grupo no Fluig.

        Args:
            grupo_json: JSON string com o objeto GroupCreate (code, description, etc.).
        """
        try:
            body = json.loads(grupo_json)
        except json.JSONDecodeError as e:
            return f"Erro: grupo_json invalido — {e}"
        return await fluig_post("/api/v1/groups", body)

    @mcp.tool()
    async def fluig_grupo_obter(codigo: str) -> str:
        """
        Obtem informacoes de um grupo pelo codigo.

        Args:
            codigo: Codigo do grupo. Ex: 'GRP_TI'.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_get(f"/api/v1/groups/{safe_code}")

    @mcp.tool()
    async def fluig_grupo_atualizar(
        codigo: str,
        grupo_json: str,
    ) -> str:
        """
        Atualiza um grupo existente.

        Args:
            codigo: Codigo do grupo a atualizar.
            grupo_json: JSON string com os campos a atualizar.
        """
        try:
            body = json.loads(grupo_json)
        except json.JSONDecodeError as e:
            return f"Erro: grupo_json invalido — {e}"
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_put(f"/api/v1/groups/{safe_code}", body)

    @mcp.tool()
    async def fluig_grupo_excluir(codigo: str) -> str:
        """
        Exclui um grupo.

        Args:
            codigo: Codigo do grupo a excluir.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_delete(f"/api/v1/groups/{safe_code}")

    @mcp.tool()
    async def fluig_grupo_membros(
        codigo: str,
        login: str = "",
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista os membros de um grupo.

        Args:
            codigo: Codigo do grupo.
            login: Filtrar por login de usuario.
            pagina: Pagina de resultados.
            tamanho: Membros por pagina.
        """
        safe_code = urlquote(str(codigo), safe="")
        params: dict = {"page": pagina, "pageSize": tamanho}
        if login:
            params["login"] = login
        return await fluig_get(f"/api/v1/groups/{safe_code}/users", params)

    @mcp.tool()
    async def fluig_grupo_adicionar_membro(
        codigo: str,
        membro_json: str,
    ) -> str:
        """
        Adiciona um membro ao grupo.

        Args:
            codigo: Codigo do grupo.
            membro_json: JSON string com dados do membro (login, etc.).
        """
        try:
            body = json.loads(membro_json)
        except json.JSONDecodeError as e:
            return f"Erro: membro_json invalido — {e}"
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_post(f"/api/v1/groups/{safe_code}/users", body)

    @mcp.tool()
    async def fluig_grupo_remover_membro(
        codigo: str,
        login: str,
    ) -> str:
        """
        Remove um membro do grupo.

        Args:
            codigo: Codigo do grupo.
            login: Login do usuario a remover.
        """
        safe_code = urlquote(str(codigo), safe="")
        safe_login = urlquote(str(login), safe="")
        return await fluig_delete(f"/api/v1/groups/{safe_code}/users/{safe_login}")

    @mcp.tool()
    async def fluig_grupo_papeis(codigo: str) -> str:
        """
        Lista os papeis (roles) atribuidos a um grupo.

        Args:
            codigo: Codigo do grupo.
        """
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_get(f"/api/v1/groups/{safe_code}/roles")

    @mcp.tool()
    async def fluig_grupo_adicionar_papel(
        codigo: str,
        papel_json: str,
    ) -> str:
        """
        Adiciona um papel (role) ao grupo.

        Args:
            codigo: Codigo do grupo.
            papel_json: JSON string com dados do papel.
        """
        try:
            body = json.loads(papel_json)
        except json.JSONDecodeError as e:
            return f"Erro: papel_json invalido — {e}"
        safe_code = urlquote(str(codigo), safe="")
        return await fluig_post(f"/api/v1/groups/{safe_code}/roles", body)

    @mcp.tool()
    async def fluig_grupo_remover_papel(
        codigo: str,
        papel: str,
    ) -> str:
        """
        Remove um papel (role) do grupo.

        Args:
            codigo: Codigo do grupo.
            papel: Codigo do papel a remover.
        """
        safe_code = urlquote(str(codigo), safe="")
        safe_role = urlquote(str(papel), safe="")
        return await fluig_delete(f"/api/v1/groups/{safe_code}/roles/{safe_role}")
