import pytest
from agents import ModelSettings, RunResult
from agents.items import ToolCallItem, ToolCallOutputItem
from openai.types.responses.response_function_tool_call import ResponseFunctionToolCall

from agency_swarm import Agent


@pytest.mark.asyncio
async def test_tools_folder_with_real_agent(tmp_path):
    """Integration test: tools_folder loads and executes tools with real OpenAI API."""
    tools_dir = tmp_path / "tools"
    tools_dir.mkdir()

    # Create a simple test tool
    tool_code = """
from agents import function_tool

@function_tool
def echo_tool(message: str) -> str:
    '''Echo the input message with a prefix.'''
    return f"Tool executed: {message}"
"""
    (tools_dir / "echo_tool.py").write_text(tool_code)

    # Create agent with tools_folder
    agent = Agent(
        name="TestAgent",
        instructions="You are a test agent. When asked to echo something, use the echo_tool with the provided message.",
        tools_folder=str(tools_dir),
        model_settings=ModelSettings(temperature=0.0),
    )

    # Verify tool was loaded
    tool_names = [tool.name for tool in agent.tools]
    assert "echo_tool" in tool_names

    # Test real execution with OpenAI API
    result: RunResult = await agent.get_response("Use the echo tool to echo 'hello world'")

    tool_call_names = [
        item.raw_item.name
        for item in result.new_items
        if isinstance(item, ToolCallItem) and isinstance(item.raw_item, ResponseFunctionToolCall)
    ]
    assert "echo_tool" in tool_call_names, f"Expected echo_tool call in new_items, got: {tool_call_names}"

    tool_outputs = [str(item.output) for item in result.new_items if isinstance(item, ToolCallOutputItem)]
    assert any("Tool executed: hello world" in output for output in tool_outputs), (
        f"Expected echo_tool output in new_items, got: {tool_outputs}"
    )
