"""API Tools: Usuarios (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_user_listar(
        codigo: str = "",
        email: str = "",
        primeiro_nome: str = "",
        ultimo_nome: str = "",
        nome_completo: str = "",
        padrao: str = "",
        papel: str = "",
        mostrar_inativos: bool = False,
        usuario_atual: bool = False,
        pagina: int = 0,
        tamanho: int = 20,
        ordem: str = "",
    ) -> str:
        """
        Lista usuarios cadastrados no Fluig com filtros opcionais.

        Args:
            codigo: Filtrar por codigo do usuario.
            email: Filtrar por e-mail.
            primeiro_nome: Filtrar por primeiro nome.
            ultimo_nome: Filtrar por ultimo nome.
            nome_completo: Filtrar por nome completo.
            padrao: Termo de busca generico (pattern).
            papel: Filtrar por papel/role.
            mostrar_inativos: Se True, inclui usuarios inativos.
            usuario_atual: Se True, retorna apenas o usuario autenticado.
            pagina: Pagina de resultados.
            tamanho: Itens por pagina.
            ordem: Campo de ordenacao.
        """
        params: dict = {"page": pagina, "pageSize": tamanho}
        if codigo:
            params["code"] = codigo
        if email:
            params["email"] = email
        if primeiro_nome:
            params["firstName"] = primeiro_nome
        if ultimo_nome:
            params["lastName"] = ultimo_nome
        if nome_completo:
            params["fullName"] = nome_completo
        if padrao:
            params["pattern"] = padrao
        if papel:
            params["role"] = papel
        if mostrar_inativos:
            params["showInactive"] = True
        if usuario_atual:
            params["currentUser"] = True
        if ordem:
            params["order"] = ordem
        return await fluig_get("/api/v1/users", params)

    @mcp.tool()
    async def fluig_user_criar(usuario_json: str) -> str:
        """
        Cria um novo usuario no Fluig.

        Args:
            usuario_json: JSON string com o objeto UserCreate (login, firstName, lastName, mail, password, etc.).
        """
        try:
            body = json.loads(usuario_json)
        except json.JSONDecodeError as e:
            return f"Erro: usuario_json invalido — {e}"
        return await fluig_post("/api/v1/users", body)

    @mcp.tool()
    async def fluig_user_obter(login: str) -> str:
        """
        Busca um usuario pelo login.

        Args:
            login: Login do usuario. Ex: 'joao.silva'.
        """
        safe_login = urlquote(str(login), safe="")
        return await fluig_get(f"/api/v1/users/{safe_login}")

    @mcp.tool()
    async def fluig_user_atualizar(
        login: str,
        usuario_json: str,
    ) -> str:
        """
        Atualiza dados de um usuario existente.

        Args:
            login: Login do usuario a atualizar.
            usuario_json: JSON string com os campos a atualizar.
        """
        try:
            body = json.loads(usuario_json)
        except json.JSONDecodeError as e:
            return f"Erro: usuario_json invalido — {e}"
        safe_login = urlquote(str(login), safe="")
        return await fluig_put(f"/api/v1/users/{safe_login}", body)

    @mcp.tool()
    async def fluig_user_ativar(login: str) -> str:
        """
        Ativa um usuario desativado.

        Args:
            login: Login do usuario.
        """
        safe_login = urlquote(str(login), safe="")
        return await fluig_post(f"/api/v1/users/{safe_login}/activate")

    @mcp.tool()
    async def fluig_user_desativar(login: str) -> str:
        """
        Desativa um usuario.

        Args:
            login: Login do usuario.
        """
        safe_login = urlquote(str(login), safe="")
        return await fluig_post(f"/api/v1/users/{safe_login}/deactivate")

    @mcp.tool()
    async def fluig_user_grupos(
        login: str,
        retornar_todos: bool = False,
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista os grupos dos quais um usuario faz parte.

        Args:
            login: Login do usuario.
            retornar_todos: Se True, retorna todos os grupos sem paginacao.
            pagina: Pagina de resultados.
            tamanho: Itens por pagina.
        """
        safe_login = urlquote(str(login), safe="")
        params: dict = {"page": pagina, "pageSize": tamanho}
        if retornar_todos:
            params["returnAll"] = True
        return await fluig_get(f"/api/v1/users/{safe_login}/groups", params)

    @mcp.tool()
    async def fluig_user_adicionar_grupo(
        login: str,
        grupo_json: str,
    ) -> str:
        """
        Adiciona um usuario a um grupo.

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

    @mcp.tool()
    async def fluig_user_remover_grupo(
        login: str,
        codigo_grupo: str,
    ) -> str:
        """
        Remove um usuario de um grupo.

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

    @mcp.tool()
    async def fluig_user_papeis(login: str) -> str:
        """
        Lista os papeis (roles) de um usuario.

        Args:
            login: Login do usuario.
        """
        safe_login = urlquote(str(login), safe="")
        return await fluig_get(f"/api/v1/users/{safe_login}/roles")

    @mcp.tool()
    async def fluig_user_foto(login: str) -> str:
        """
        Obtem a foto de perfil de um usuario.

        Args:
            login: Login do usuario.
        """
        safe_login = urlquote(str(login), safe="")
        return await fluig_get(f"/api/v1/users/{safe_login}/picture")
