"""Real optional LangChain/Ollama agent. Public sample; ordinary observations only."""
import json
import os
from pathlib import Path
import tempfile
from langchain.agents import create_agent
from langchain_core.tools import tool
from langchain_ollama import ChatOllama
from soterias import Soterias
from soterias.integrations.langchain import SoteriasMiddleware
from learned_total import learn_total, calculate

tool_calls = []
directory = Path(tempfile.mkdtemp(prefix="soterias-langchain-"))


@tool
def invoice_total(quantity: int, unit_price: int) -> str:
    """Multiply a quantity by a unit price in integer minor currency units."""
    result, report = calculate(qualified, environment, quantity, unit_price)
    tool_calls.append({"quantity": quantity, "unit_price": unit_price, "total": int(result),
                       "learned_execution": report})
    return result


with Soterias(workflow="invoice-assistant", directory=directory / "metrics") as sdk:
    # Include actual qualification/setup time as its own native observation.
    qualified, environment = sdk.run(learn_total, directory / "memory")
    agent = create_agent(
        model=ChatOllama(model=os.environ.get("OLLAMA_MODEL", "qwen3.5:4b"),
                         base_url=os.environ.get("OLLAMA_BASE_URL", "http://127.0.0.1:11434"),
                         temperature=0, seed=7, reasoning=False, num_predict=384),
        tools=[invoice_total],
        middleware=[SoteriasMiddleware(sdk, provider="ollama")],
        system_prompt="Use invoice_total for the requested calculation. Report the actual tool result.",
    )
    response = agent.invoke({"messages": [{"role": "user", "content":
        "Use invoice_total for quantity 6 and unit_price 1200. Then state the result."}]},
        config={"recursion_limit": 6})
    assert len(tool_calls) == 1
    assert {key: tool_calls[0][key] for key in ("quantity", "unit_price", "total")} == {
        "quantity": 6, "unit_price": 1200, "total": 7200}
    assert "7200" in str(response["messages"][-1].content)
    print(json.dumps({"actual_tool_calls": tool_calls, "metrics": sdk.summary(),
                      "security_mode": "ordinary-observation", "output_quality": "unscored",
                      "metrics_directory": str(directory)}))
