import asyncio

from cayu import (
    AgentSpec,
    CayuApp,
    Message,
    RunRequest,
    ScriptedModelProvider,
    StructuredOutputSpec,
    run_to_completion,
    scripted_structured_output,
)

provider = ScriptedModelProvider(
    [
        scripted_structured_output({"wrong": "shape"}),
        scripted_structured_output({"invoice_total": 42.5}),
    ]
)
app = CayuApp(enable_logging=False)
app.register_provider(provider, default=True)
app.register_agent(AgentSpec(name="invoice_analyst", model="scripted-model"))

request = RunRequest(
    agent_name="invoice_analyst",
    messages=[Message.text("user", "Extract the invoice total")],
    max_steps=2,
    structured_output=StructuredOutputSpec(
        name="invoice",
        max_retries=1,
        json_schema={
            "type": "object",
            "properties": {"invoice_total": {"type": "number"}},
            "required": ["invoice_total"],
            "additionalProperties": False,
        },
    ),
)
outcome = asyncio.run(run_to_completion(app, request))

assert outcome.ok
assert outcome.final_text == ""
assert outcome.structured_output is not None
assert outcome.structured_output.output == {"invoice_total": 42.5}
assert outcome.structured_output.attempt == 2
