"""Example demonstrating subagent usage in AgentLite.

This example shows how to create a parent agent with subagents
and delegate tasks to them using the Task tool.
"""

import asyncio

from agentlite import Agent, OpenAIProvider
from agentlite.tools.multiagent.task import Task


async def main():
    """Run subagent example."""

    print("=" * 60)
    print("AgentLite Subagent Example")
    print("=" * 60)

    # Note: This example requires a valid API key
    # Replace with your actual API key to run
    api_key = "your-api-key"

    if api_key == "your-api-key":
        print("\nNOTE: Set your API key to run this example")
        print("Example code is shown below:\n")
        print("-" * 40)

    # Create provider
    provider = OpenAIProvider(api_key=api_key, model="gpt-4")

    # Example 1: Create subagents manually
    print("\n=== Example 1: Manual Subagent Setup ===")

    # Create parent agent with empty labor market
    parent = Agent(
        provider=provider,
        system_prompt="You are a coordinator agent that delegates tasks to specialists.",
        name="coordinator",
    )

    # Create subagents
    coder = Agent(
        provider=provider,
        system_prompt="You are a coding specialist. Write clean, well-documented code.",
        name="coder",
    )

    reviewer = Agent(
        provider=provider,
        system_prompt="You are a code reviewer. Provide constructive feedback.",
        name="reviewer",
    )

    # Register subagents with parent
    parent.add_subagent("coder", coder, "Writes code", dynamic=False)
    parent.add_subagent("reviewer", reviewer, "Reviews code", dynamic=False)

    # Add Task tool to parent
    parent.tools.add(Task(labor_market=parent.labor_market))

    print("Created parent agent with subagents:")
    print("  - coder: Writes code")
    print("  - reviewer: Reviews code")

    # Example 2: Using subagents
    print("\n=== Example 2: Delegating Tasks ===")

    # Parent agent delegates to coder
    # response = await parent.run(
    #     "I need a Python function to calculate fibonacci numbers. "
    #     "Use the coder subagent to write it."
    # )
    print("(Requires API key - uncomment to run)")

    # Example 3: Nested subagents (hierarchy)
    print("\n=== Example 3: Hierarchical Structure ===")

    # Create a team lead with team members as subagents
    team_lead = Agent(
        provider=provider,
        system_prompt="You are a team lead. Coordinate work among your team members.",
        name="team_lead",
    )

    # Create team members
    backend_dev = Agent(
        provider=provider,
        system_prompt="You are a backend developer. Focus on API design and database.",
        name="backend_dev",
    )

    frontend_dev = Agent(
        provider=provider,
        system_prompt="You are a frontend developer. Focus on UI/UX.",
        name="frontend_dev",
    )

    tester = Agent(
        provider=provider,
        system_prompt="You are a QA engineer. Write test cases and find bugs.",
        name="tester",
    )

    # Add subagents to team lead
    team_lead.add_subagent("backend", backend_dev, "Backend development")
    team_lead.add_subagent("frontend", frontend_dev, "Frontend development")
    team_lead.add_subagent("qa", tester, "Quality assurance")

    # Add Task tool
    team_lead.tools.add(Task(labor_market=team_lead.labor_market))

    print("Created team hierarchy:")
    print("  team_lead/")
    print("    ├── backend: Backend development")
    print("    ├── frontend: Frontend development")
    print("    └── qa: Quality assurance")

    # Example 4: Dynamic subagents
    print("\n=== Example 4: Dynamic Subagents ===")

    # Create subagent dynamically
    specialist = Agent(
        provider=provider,
        system_prompt="You are a specialist for a specific task.",
        name="specialist",
    )

    # Add as dynamic subagent
    team_lead.add_subagent("specialist", specialist, "Temporary specialist", dynamic=True)

    print("Added dynamic subagent 'specialist' to team_lead")

    # Example 5: Agent discovery
    print("\n=== Example 5: Agent Discovery ===")

    print(f"Team lead's subagents: {team_lead.labor_market.list_subagents()}")
    print(f"Descriptions: {team_lead.labor_market.subagent_descriptions}")

    # Check if subagent exists
    if "backend" in team_lead.labor_market:
        print("Backend subagent is available")

    # Get specific subagent
    backend = team_lead.get_subagent("backend")
    print(f"Backend agent name: {backend.name if backend else 'not found'}")

    # Example 6: Create subagent copy
    print("\n=== Example 6: Subagent Copy ===")

    # Create a copy of parent for use as subagent elsewhere
    parent_copy = parent.create_subagent_copy()
    print(f"Created copy of parent: {parent_copy.name}")
    print(f"Copy has empty labor market: {len(parent_copy.labor_market) == 0}")

    print("\n" + "=" * 60)
    print("Examples Complete")
    print("=" * 60)
    print("\nKey Concepts:")
    print("1. Parent agent holds subagents in LaborMarket")
    print("2. Task tool allows parent to delegate to subagents")
    print("3. Subagents have independent history and context")
    print("4. Fixed subagents are defined at setup")
    print("5. Dynamic subagents can be added at runtime")


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