import time

import _paths
from autogencap.ag_adapter.agent import Agent
from autogencap.config import IGNORED_LOG_CONTEXTS
from autogencap.runtime_factory import RuntimeFactory

from autogen import UserProxyAgent

# Filter out some Log message contexts
IGNORED_LOG_CONTEXTS.extend(["BROKER"])


def main():
    # Standard AutoGen
    user_proxy = UserProxyAgent(
        "user_proxy",
        code_execution_config={"work_dir": "coding"},
        is_termination_msg=lambda x: "TERMINATE" in x.get("content"),
    )

    # Wrap AutoGen Agent in CAP
    cap_user_proxy = Agent(user_proxy, counter_party_name="assistant", init_chat=True)
    # Create the message bus
    ensemble = RuntimeFactory.get_runtime("ZMQ")
    # Add the user_proxy to the message bus
    cap_user_proxy.register(ensemble)
    # Start message processing
    ensemble.connect()

    # Wait for the user_proxy to finish
    interact_with_user(ensemble, cap_user_proxy)
    # Cleanup
    ensemble.disconnect()


# Starts the Broker and the Assistant. The UserProxy is started separately.
def interact_with_user(network, cap_assistant):
    user_proxy_conn = network.find_by_name("user_proxy")
    example = "Plot a chart of MSFT daily closing prices for last 1 Month."
    print(f"Example: {example}")
    try:
        user_input = input("Please enter your command: ")
        if user_input == "":
            user_input = example
        print(f"Sending: {user_input}")
        user_proxy_conn.send_txt_msg(user_input)

        # Hang around for a while
        while cap_assistant.running():
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("Interrupted by user, shutting down.")


if __name__ == "__main__":
    main()
