"""Fase 4 — API Tools: Social / Comunidades / Posts / Favoritos (v3 collaboration)"""
import json
from urllib.parse import quote as urlquote
from mcp.server.fastmcp import FastMCP
from http_client import fluig_get, fluig_post, fluig_delete


def register(mcp: FastMCP):

    # ── COMUNIDADES ──────────────────────────────────────────

    @mcp.tool()
    async def fluig_comunidade_listar(
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista as comunidades disponiveis no Fluig.

        Args:
            pagina: Pagina de resultados.
            tamanho: Comunidades por pagina.
        """
        return await fluig_get(
            "/api/v3/communities",
            params={"page": pagina, "pageSize": tamanho},
        )

    @mcp.tool()
    async def fluig_comunidade_obter(comunidade_id: str) -> str:
        """
        Obtem dados de uma comunidade especifica.

        Args:
            comunidade_id: ID da comunidade.
        """
        safe_id = urlquote(str(comunidade_id), safe="")
        return await fluig_get(f"/api/v3/communities/{safe_id}")

    @mcp.tool()
    async def fluig_comunidade_criar(
        nome: str,
        descricao: str,
        publica: bool = True,
    ) -> str:
        """
        Cria uma nova comunidade no Fluig.

        Args:
            nome: Nome da comunidade.
            descricao: Descricao da comunidade.
            publica: Se True, a comunidade e publica. Se False, privada.
        """
        body = {
            "communityName": nome,
            "communityDescription": descricao,
            "publicCommunity": publica,
        }
        return await fluig_post("/api/v3/communities", body)

    @mcp.tool()
    async def fluig_comunidade_membros(
        comunidade_id: str,
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista os membros de uma comunidade.

        Args:
            comunidade_id: ID da comunidade.
            pagina: Pagina de resultados.
            tamanho: Membros por pagina.
        """
        safe_id = urlquote(str(comunidade_id), safe="")
        return await fluig_get(
            f"/api/v3/communities/{safe_id}/members",
            params={"page": pagina, "pageSize": tamanho},
        )

    # ── POSTS ──────────────────────────────────────────────────

    @mcp.tool()
    async def fluig_post_criar(
        mensagem: str,
        comunidade_id: str = "",
    ) -> str:
        """
        Publica um post na timeline ou em uma comunidade.

        Args:
            mensagem: Conteudo do post.
            comunidade_id: ID da comunidade de destino. Vazio = timeline pessoal.
        """
        body: dict = {"postContent": mensagem}
        if comunidade_id:
            body["communityId"] = comunidade_id
        return await fluig_post("/api/v3/posts", body)

    @mcp.tool()
    async def fluig_post_timeline(
        login_usuario: str = "",
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Retorna a timeline de posts de um usuario ou do usuario autenticado.

        Args:
            login_usuario: Login do usuario. Vazio = usuario autenticado.
            pagina: Pagina de resultados.
            tamanho: Posts por pagina.
        """
        params: dict = {"page": pagina, "pageSize": tamanho}
        if login_usuario:
            safe_login = urlquote(str(login_usuario), safe="")
            return await fluig_get(
                f"/api/v3/timeline/{safe_login}", params=params,
            )
        return await fluig_get("/api/v3/timeline", params=params)

    @mcp.tool()
    async def fluig_post_curtir(post_id: str) -> str:
        """
        Curte um post na plataforma social.

        Args:
            post_id: ID do post a curtir.
        """
        safe_id = urlquote(str(post_id), safe="")
        return await fluig_post(f"/api/v3/posts/{safe_id}/like")

    # ── ARTIGOS ─────────────────────────────────────────────────

    @mcp.tool()
    async def fluig_artigo_criar(
        titulo: str,
        conteudo: str,
        comunidade_id: str,
    ) -> str:
        """
        Cria um artigo em uma comunidade.

        Args:
            titulo: Titulo do artigo.
            conteudo: Conteudo HTML do artigo.
            comunidade_id: ID da comunidade onde publicar.
        """
        body = {
            "articleTitle": titulo,
            "articleContent": conteudo,
            "communityId": comunidade_id,
        }
        return await fluig_post("/api/v3/articles", body)

    @mcp.tool()
    async def fluig_artigo_listar(
        comunidade_id: str,
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista artigos publicados em uma comunidade.

        Args:
            comunidade_id: ID da comunidade.
            pagina: Pagina de resultados.
            tamanho: Artigos por pagina.
        """
        safe_id = urlquote(str(comunidade_id), safe="")
        return await fluig_get(
            f"/api/v3/communities/{safe_id}/articles",
            params={"page": pagina, "pageSize": tamanho},
        )

    # ── FAVORITOS ───────────────────────────────────────────────

    @mcp.tool()
    async def fluig_favorito_adicionar(
        tipo: str,
        item_id: str,
    ) -> str:
        """
        Marca um item como favorito.

        Args:
            tipo: Tipo do item. Opcoes: 'document', 'process', 'community', 'post', 'article'.
            item_id: ID do item a favoritar.
        """
        body = {
            "itemType": tipo,
            "itemId": item_id,
        }
        return await fluig_post("/api/v3/favorites", body)

    @mcp.tool()
    async def fluig_favorito_listar(
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista os itens favoritos do usuario autenticado.

        Args:
            pagina: Pagina de resultados.
            tamanho: Favoritos por pagina.
        """
        return await fluig_get(
            "/api/v3/favorites",
            params={"page": pagina, "pageSize": tamanho},
        )
