# from swarms.structs import Flow
# from swarms.models import OpenAIChat
# from swarms.swarms.groupchat import GroupChat
# from swarms.agents import SimpleAgent

# api_key = ""

# llm = OpenAIChat(
#     openai_api_key=api_key,
# )

# agent1 = SimpleAgent("Captain Price", Flow(llm=llm, max_loops=4))
# agent2 = SimpleAgent("John Mactavis", Flow(llm=llm, max_loops=4))

# # Create a groupchat with the 2 agents
# chat = GroupChat([agent1, agent2])

# # Assign duties to the agents
# chat.assign_duty(agent1.name, "Buy the groceries")
# chat.assign_duty(agent2.name, "Clean the house")

# # Initate a chat
# response = chat.run("Captain Price", "Hello, how are you John?")
# print(response)


from swarms.models import OpenAIChat
from swarms.structs import Flow
import random

api_key = ""  # Your API Key here


class GroupChat:
    """
    GroupChat class that facilitates agent-to-agent communication using multiple instances of the Flow class.
    """

    def __init__(self, agents: list):
        self.agents = {f"agent_{i}": agent for i, agent in enumerate(agents)}
        self.message_log = []

    def add_agent(self, agent: Flow):
        agent_id = f"agent_{len(self.agents)}"
        self.agents[agent_id] = agent

    def remove_agent(self, agent_id: str):
        if agent_id in self.agents:
            del self.agents[agent_id]

    def send_message(self, sender_id: str, recipient_id: str, message: str):
        if sender_id not in self.agents or recipient_id not in self.agents:
            raise ValueError("Invalid sender or recipient ID.")
        formatted_message = f"{sender_id} to {recipient_id}: {message}"
        self.message_log.append(formatted_message)
        recipient_agent = self.agents[recipient_id]
        recipient_agent.run(message)

    def broadcast_message(self, sender_id: str, message: str):
        for agent_id, agent in self.agents.items():
            if agent_id != sender_id:
                self.send_message(sender_id, agent_id, message)

    def get_message_log(self):
        return self.message_log


class EnhancedGroupChatV2(GroupChat):
    def __init__(self, agents: list):
        super().__init__(agents)

    def multi_round_conversation(self, rounds: int = 5):
        """
        Initiate a multi-round conversation between agents.

        Args:
            rounds (int): The number of rounds of conversation.
        """
        for _ in range(rounds):
            # Randomly select a sender and recipient agent for the conversation
            sender_id = random.choice(list(self.agents.keys()))
            recipient_id = random.choice(list(self.agents.keys()))
            while recipient_id == sender_id:  # Ensure the recipient is not the sender
                recipient_id = random.choice(list(self.agents.keys()))

            # Generate a message (for simplicity, a generic message is used)
            message = f"Hello {recipient_id}, how are you today?"
            self.send_message(sender_id, recipient_id, message)


# Sample usage with EnhancedGroupChatV2
# Initialize the language model
llm = OpenAIChat(
    openai_api_key=api_key,
    temperature=0.5,
    max_tokens=3000,
)

# Initialize two Flow agents
agent1 = Flow(llm=llm, max_loops=5, dashboard=True)
agent2 = Flow(llm=llm, max_loops=5, dashboard=True)

# Create an enhanced group chat with the two agents
enhanced_group_chat_v2 = EnhancedGroupChatV2(agents=[agent1, agent2])

# Simulate multi-round agent to agent communication
enhanced_group_chat_v2.multi_round_conversation(rounds=5)

enhanced_group_chat_v2.get_message_log()  # Get the conversation log