# Copyright (c) Microsoft. All rights reserved.

import asyncio

from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient, OpenAIChatOptions
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

"""
OpenAI Chat Client Reasoning Example

This sample demonstrates advanced reasoning capabilities using OpenAI's gpt-5 models,
showing step-by-step reasoning process visualization and complex problem-solving.

This uses the default_options parameter to enable reasoning with high effort and detailed summaries.
You can also set these options at the run level using the options parameter.
Since these are api and/or provider specific, you will need to lookup
the correct values for your provider, as they are passed through as-is.

In this case they are here: https://platform.openai.com/docs/api-reference/responses/create#responses-create-reasoning
"""


agent = Agent(
    client=OpenAIChatClient[OpenAIChatOptions](model="gpt-5"),
    name="MathHelper",
    instructions="You are a personal math tutor. When asked a math question, "
    "reason over how best to approach the problem and share your thought process.",
    default_options={"reasoning": {"effort": "high", "summary": "detailed"}},
)


async def reasoning_example() -> None:
    """Example of reasoning response (get results as they are generated)."""
    print("\033[92m=== Reasoning Example ===\033[0m")

    query = "I need to solve the equation 3x + 11 = 14 and I need to prove the pythagorean theorem. Can you help me?"
    print(f"User: {query}")
    print(f"{agent.name}: ", end="", flush=True)
    response = await agent.run(query)
    for msg in response.messages:
        if msg.contents:
            for content in msg.contents:
                if content.type == "text_reasoning":
                    print(f"\033[94m{content.text}\033[0m", end="", flush=True)
                elif content.type == "text":
                    print(content.text, end="", flush=True)
    print("\n")
    if response.usage_details:
        print(f"Usage: {response.usage_details}")


async def streaming_reasoning_example() -> None:
    """Example of reasoning response (get results as they are generated)."""
    print("\033[92m=== Streaming Reasoning Example ===\033[0m")

    query = "I need to solve the equation 3x + 11 = 14 and I need to prove the pythagorean theorem. Can you help me?"
    print(f"User: {query}")
    print(f"{agent.name}: ", end="", flush=True)
    usage = None
    async for chunk in agent.run(query, stream=True):
        if chunk.contents:
            for content in chunk.contents:
                if content.type == "text_reasoning":
                    print(f"\033[94m{content.text}\033[0m", end="", flush=True)
                elif content.type == "text":
                    print(content.text, end="", flush=True)
                elif content.type == "usage":
                    usage = content
    print("\n")
    if usage:
        print(f"Usage: {usage.usage_details}")


async def main() -> None:
    print("\033[92m=== Basic OpenAI Chat Reasoning Agent Example ===\033[0m")

    await reasoning_example()
    await streaming_reasoning_example()


if __name__ == "__main__":
    asyncio.run(main())
