"""API Tools: Documentos / GED (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_patch, fluig_delete


def register(mcp: FastMCP):

    # ── DOCUMENTOS ─────────────────────────────────────────────

    @mcp.tool()
    async def fluig_doc_obter(documento_id: int) -> str:
        """
        Obtem os detalhes de um documento pelo ID.

        Args:
            documento_id: ID do documento no GED.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_get(f"/api/v2/documents/{safe_id}")

    @mcp.tool()
    async def fluig_doc_atualizar(
        documento_id: int,
        propriedades: str,
    ) -> str:
        """
        Atualiza propriedades de um documento existente (PATCH parcial).

        Args:
            documento_id: ID do documento.
            propriedades: JSON object com as propriedades a atualizar. Ex: '{"documentDescription":"Nova descricao"}'.
        """
        try:
            body = json.loads(propriedades)
        except json.JSONDecodeError as e:
            return f"Erro: propriedades JSON invalido - {e}"
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_patch(f"/api/v2/documents/{safe_id}", body)

    @mcp.tool()
    async def fluig_doc_excluir(documento_id: int) -> str:
        """
        Remove um documento do GED.

        Args:
            documento_id: ID do documento a excluir.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_delete(f"/api/v2/documents/{safe_id}")

    @mcp.tool()
    async def fluig_doc_upload(nome_arquivo: str) -> str:
        """
        Faz upload de um arquivo para a area temporaria do Fluig (primeiro passo antes de publicar).

        Args:
            nome_arquivo: Nome do arquivo com extensao. Ex: 'relatorio.pdf'.
        """
        safe_name = urlquote(str(nome_arquivo), safe="")
        return await fluig_post(f"/api/v2/documents/upload/{safe_name}")

    @mcp.tool()
    async def fluig_doc_publicar(body_json: str) -> str:
        """
        Publica arquivos ja enviados via upload no ECM do Fluig.

        Args:
            body_json: JSON object com dados de publicacao (pasta destino, metadados, 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/documents/publish", body)

    @mcp.tool()
    async def fluig_doc_upload_publicar(
        nome_arquivo: str,
        pasta_pai_id: int,
    ) -> str:
        """
        Faz upload e publica um arquivo em um unico passo.

        Args:
            nome_arquivo: Nome do arquivo com extensao.
            pasta_pai_id: ID da pasta de destino.
        """
        safe_name = urlquote(str(nome_arquivo), safe="")
        safe_parent = urlquote(str(pasta_pai_id), safe="")
        return await fluig_post(f"/api/v2/documents/upload/{safe_name}/{safe_parent}/publish")

    @mcp.tool()
    async def fluig_doc_download(documento_id: int) -> str:
        """
        Obtem o stream/URL de download de um documento.

        Args:
            documento_id: ID do documento.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_get(f"/api/v2/documents/{safe_id}/stream")

    @mcp.tool()
    async def fluig_doc_comentar(body_json: str) -> str:
        """
        Cria um comentario em um documento.

        Args:
            body_json: JSON object com dados do comentario. Ex: '{"documentId":123,"comment":"Ótimo documento!"}'.
        """
        try:
            body = json.loads(body_json)
        except json.JSONDecodeError as e:
            return f"Erro: body_json invalido - {e}"
        return await fluig_post("/api/v2/documents/comment", body)

    @mcp.tool()
    async def fluig_doc_comentarios(documento_id: int) -> str:
        """
        Lista os comentarios de um documento.

        Args:
            documento_id: ID do documento.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_get(f"/api/v2/documents/{safe_id}/comments")

    @mcp.tool()
    async def fluig_doc_favoritar(documento_id: int) -> str:
        """
        Adiciona um documento aos favoritos do usuario.

        Args:
            documento_id: ID do documento.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_post(f"/api/v2/documents/{safe_id}/favorite")

    @mcp.tool()
    async def fluig_doc_desfavoritar(documento_id: int) -> str:
        """
        Remove um documento dos favoritos do usuario.

        Args:
            documento_id: ID do documento.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_delete(f"/api/v2/documents/{safe_id}/favorite")

    @mcp.tool()
    async def fluig_doc_thumbnail(documento_id: int) -> str:
        """
        Obtem a thumbnail (miniatura) de um documento.

        Args:
            documento_id: ID do documento.
        """
        safe_id = urlquote(str(documento_id), safe="")
        return await fluig_get(f"/api/v2/documents/{safe_id}/thumbnail")

    @mcp.tool()
    async def fluig_doc_tamanho_max_upload() -> str:
        """Retorna o tamanho maximo permitido para upload de arquivos."""
        return await fluig_get("/api/v2/documents/maxUploadSize")

    @mcp.tool()
    async def fluig_doc_limpar_uploads() -> str:
        """Limpa a area temporaria de uploads do usuario."""
        return await fluig_delete("/api/v2/documents/uploads")

    # ── PASTAS ─────────────────────────────────────────────────

    @mcp.tool()
    async def fluig_pasta_criar(
        pasta_pai_id: int,
        body_json: str,
    ) -> str:
        """
        Cria uma nova pasta no GED.

        Args:
            pasta_pai_id: ID da pasta pai.
            body_json: JSON object com dados da pasta. Ex: '{"documentDescription":"Minha Pasta"}'.
        """
        try:
            body = json.loads(body_json)
        except json.JSONDecodeError as e:
            return f"Erro: body_json invalido - {e}"
        safe_parent = urlquote(str(pasta_pai_id), safe="")
        return await fluig_post(f"/api/v2/folders/{safe_parent}", body)

    @mcp.tool()
    async def fluig_pasta_listar(
        pasta_pai_id: int,
        pagina: int = 0,
        tamanho: int = 20,
    ) -> str:
        """
        Lista os documentos dentro de uma pasta.

        Args:
            pasta_pai_id: ID da pasta.
            pagina: Pagina de resultados.
            tamanho: Itens por pagina.
        """
        safe_parent = urlquote(str(pasta_pai_id), safe="")
        params = {"page": pagina, "pageSize": tamanho}
        return await fluig_get(f"/api/v2/folders/{safe_parent}/documents", params)

    @mcp.tool()
    async def fluig_pasta_breadcrumb(
        document_root_id: int,
        current_document_id: int,
    ) -> str:
        """
        Retorna o breadcrumb (caminho de navegacao) de uma pasta.

        Args:
            document_root_id: ID do documento raiz.
            current_document_id: ID do documento/pasta atual.
        """
        safe_root = urlquote(str(document_root_id), safe="")
        safe_current = urlquote(str(current_document_id), safe="")
        return await fluig_get(f"/api/v2/folders/{safe_root}/{safe_current}")
