# Copyright (c) Microsoft. All rights reserved.

"""Tests for service-managed thread IDs, and service-generated response ids."""

from typing import Any

from ag_ui.core import RunFinishedEvent, RunStartedEvent
from agent_framework import Content
from agent_framework._types import AgentResponseUpdate, ChatResponseUpdate


async def test_service_thread_id_when_there_are_updates(stub_agent):
    """Test that service-managed thread IDs (conversation_id) are correctly set as the thread_id in events."""
    from agent_framework.ag_ui import AgentFrameworkAgent

    updates: list[AgentResponseUpdate] = [
        AgentResponseUpdate(
            contents=[Content.from_text(text="Hello, user!")],
            response_id="resp_67890",
            raw_representation=ChatResponseUpdate(
                contents=[Content.from_text(text="Hello, user!")],
                conversation_id="conv_12345",
                response_id="resp_67890",
            ),
        )
    ]
    agent = stub_agent(updates=updates)
    wrapper = AgentFrameworkAgent(agent=agent)

    input_data = {
        "messages": [{"role": "user", "content": "Hi"}],
    }

    events: list[Any] = []
    async for event in wrapper.run(input_data):
        events.append(event)

    assert isinstance(events[0], RunStartedEvent)
    assert events[0].run_id == "resp_67890"
    assert events[0].thread_id == "conv_12345"
    assert isinstance(events[-1], RunFinishedEvent)


async def test_service_thread_id_when_no_user_message(stub_agent):
    """Test when user submits no messages, emitted events still have with a thread_id"""
    from agent_framework.ag_ui import AgentFrameworkAgent

    updates: list[AgentResponseUpdate] = []
    agent = stub_agent(updates=updates)
    wrapper = AgentFrameworkAgent(agent=agent)

    input_data: dict[str, list[dict[str, str]]] = {
        "messages": [],
    }

    events: list[Any] = []
    async for event in wrapper.run(input_data):
        events.append(event)

    assert len(events) == 2
    assert isinstance(events[0], RunStartedEvent)
    assert events[0].thread_id
    assert isinstance(events[-1], RunFinishedEvent)


async def test_service_thread_id_when_user_supplied_thread_id(stub_agent):
    """Test that user-supplied thread IDs are preserved in emitted events."""
    from agent_framework.ag_ui import AgentFrameworkAgent

    updates: list[AgentResponseUpdate] = []
    agent = stub_agent(updates=updates)
    wrapper = AgentFrameworkAgent(agent=agent)

    input_data: dict[str, Any] = {"messages": [{"role": "user", "content": "Hi"}], "threadId": "conv_12345"}

    events: list[Any] = []
    async for event in wrapper.run(input_data):
        events.append(event)

    assert isinstance(events[0], RunStartedEvent)
    assert events[0].thread_id == "conv_12345"
    assert isinstance(events[-1], RunFinishedEvent)
