"""
Cliente mínimo da API Pública do DataJud (CNJ).

Uma função só: `consultar(corpo)`. Recebe um dicionário no formato de consulta
do Elasticsearch, devolve a resposta como dicionário Python.

Não usa nenhuma biblioteca externa — só a `urllib` que já vem com o Python.
"""

import json
import os
import urllib.error
import urllib.request

# ---------------------------------------------------------------------------
# Endereço e chave.
#
# A chave abaixo é PÚBLICA: o próprio CNJ a publica na documentação da API
# (https://datajud-wiki.cnj.jus.br/api-publica/acesso). Ela não identifica você
# nem dá acesso a nada além do que já é público.
#
# Mesmo assim, o hábito correto é ler credenciais do ambiente, e não deixá-las
# escritas no código. É por isso que o valor abaixo é apenas o *padrão* de uma
# variável de ambiente: quando você for usar uma chave que de fato seja secreta,
# o código não muda — só o valor de DATAJUD_API_KEY.
# ---------------------------------------------------------------------------
TRIBUNAL = os.environ.get("DATAJUD_TRIBUNAL", "tjrj")
URL = f"https://api-publica.datajud.cnj.jus.br/api_publica_{TRIBUNAL}/_search"

CHAVE = os.environ.get(
    "DATAJUD_API_KEY",
    "cDZHYzlZa0JadVREZDJCendQbXY6SkJlTzNjLV9TRENyQk1RdnFKZGRQdw==",
)


class ErroDataJud(Exception):
    """Falha na conversa com a API. Carrega o texto que o CNJ devolveu."""


def consultar(corpo: dict, timeout: int = 60) -> dict:
    """Envia uma consulta à API Pública do DataJud e devolve a resposta."""
    requisicao = urllib.request.Request(
        URL,
        data=json.dumps(corpo).encode("utf-8"),
        headers={
            "Authorization": f"APIKey {CHAVE}",
            "Content-Type": "application/json",
        },
        method="POST",
    )

    try:
        with urllib.request.urlopen(requisicao, timeout=timeout) as resposta:
            return json.load(resposta)
    except urllib.error.HTTPError as e:
        # O corpo do erro do Elasticsearch diz exatamente o que está errado
        # na sua consulta. Jogar essa mensagem fora é jogar fora o diagnóstico.
        detalhe = e.read().decode("utf-8", "replace")
        raise ErroDataJud(f"HTTP {e.code}: {detalhe[:500]}") from None
    except urllib.error.URLError as e:
        raise ErroDataJud(
            f"Não foi possível alcançar a API do CNJ ({e.reason}). "
            "Verifique sua conexão e se a rede do Tribunal permite a saída."
        ) from None
