"""
O mesmo Alfred judiciário, agora com o smolagents.

Compare com exemplos/agente_do_zero.py: as Tools são praticamente as mesmas
funções; o que desaparece é todo o encanamento (system prompt do ciclo,
stop sequence, parser da Action, laço, contagem de passos).

Pré-requisitos:
    - Ollama rodando (verifique com: curl http://127.0.0.1:11434/api/version)
    - Modelo baixado:  ollama pull qwen2:7b
    - Base gerada:     python dados\\gerar_base.py
    - Dependências:    pip install "smolagents[litellm]"

Rode com:
    python exemplos\\alfred_smolagents.py
"""

import json
import os
import sqlite3

from smolagents import CodeAgent, LiteLLMModel, tool

BASE = os.path.join(os.path.dirname(__file__), "..", "..", "dados", "acervo.db")

# ---------------------------------------------------------------------------
# Nível de acesso da sessão.
#
# Continua sendo uma constante do SEU programa, não um argumento de Tool.
# Trocar de framework não muda nada aqui — e não deveria mudar.
#   0 = Público   1 = Segredo de Justiça   2 = Sigilo Absoluto
# ---------------------------------------------------------------------------
TETO_SIGILO = 1


@tool
def consultar_assunto(termo: str) -> int:
    """Converte o nome de um assunto judicial no código numérico correspondente.

    Args:
        termo: nome (ou parte do nome) do assunto, por exemplo "violência doméstica".
    """
    con = sqlite3.connect(BASE)
    linha = con.execute(
        "SELECT codigo, nome FROM dim_assunto WHERE lower(nome) LIKE ?",
        ("%" + termo.lower().strip() + "%",),
    ).fetchone()
    con.close()

    if linha is None:
        con = sqlite3.connect(BASE)
        nomes = [r[0] for r in con.execute("SELECT nome FROM dim_assunto")]
        con.close()
        # A exceção vira Observation e volta ao modelo, sem sujar o tipo de retorno.
        raise ValueError(
            "Assunto nao encontrado. Assuntos disponiveis: " + "; ".join(nomes)
        )

    # Devolve o código puro: é isso que buscar_processos espera receber.
    return linha[0]


@tool
def buscar_processos(codigo_assunto: int, limite: int = 5) -> str:
    """Lista os processos mais recentes de um assunto, do mais novo para o mais antigo.

    Args:
        codigo_assunto: código numérico do assunto, obtido com consultar_assunto.
        limite: quantos processos devolver (máximo 20).
    """
    limite = max(1, min(int(limite), 20))

    con = sqlite3.connect(BASE)
    con.row_factory = sqlite3.Row
    linhas = con.execute(
        """
        SELECT p.numero_processo, p.data_distribuicao, p.situacao,
               o.nome AS orgao_julgador, c.nome AS classe
        FROM fato_processo p
        JOIN ponte_processo_assunto pa
          ON pa.id_processo = p.id_processo AND pa.principal = 1
        JOIN dim_assunto        a ON a.id_assunto = pa.id_assunto
        JOIN dim_classe         c ON c.id_classe  = p.id_classe
        JOIN dim_orgao_julgador o ON o.id_orgao   = p.id_orgao
        WHERE a.codigo = ?
          AND p.id_nivel_sigilo <= ?
        ORDER BY p.data_distribuicao DESC
        LIMIT ?
        """,
        (int(codigo_assunto), TETO_SIGILO, limite),
    ).fetchall()
    con.close()

    if not linhas:
        return "Nenhum processo encontrado para este assunto."

    return json.dumps([dict(l) for l in linhas], ensure_ascii=False)


# ---------------------------------------------------------------------------
# O modelo. Continua sendo o Ollama na sua máquina.
#
# "ollama_chat/" é o prefixo que o LiteLLM usa para falar com o endpoint de
# chat do Ollama. O api_base aponta para o servidor local: nada sai daqui.
# ---------------------------------------------------------------------------
modelo = LiteLLMModel(
    model_id="ollama_chat/qwen2:7b",
    api_base="http://127.0.0.1:11434",
    num_ctx=8192,
    temperature=0,
)

agente = CodeAgent(
    tools=[consultar_assunto, buscar_processos],
    model=modelo,
    max_steps=6,
    additional_authorized_imports=[],  # nenhum import além do básico
)


if __name__ == "__main__":
    resposta = agente.run(
        "Traga os 3 processos mais recentes sobre violência doméstica. "
        "Use somente os dados devolvidos pelas Tools."
    )
    print("\n" + "=" * 70)
    print("RESPOSTA FINAL:")
    print(resposta)
