import sys
import json
import shlex

# Import all AgentManagers
from aws_ai_agents.agent_manager import AgentManager as AWSAgentManager
from gcp_ai_agents.gcp_agent_manager import GCPAgentManager
from azure_ai_agents.azure_agent_manager import AzureAgentManager
from azure_ai_agents.azure_connector import AzureConnector
from aws_ai_agents.aws_connector import AWSConnector

def display_help(manager, selected_service=None):
    if selected_service:
        print(f"\n--- Commands for {selected_service.upper()} ---")
        commands = manager.get_service_commands(selected_service)
        if commands:
            for cmd in commands:
                print(f"- {cmd}")
        else:
            print(f"No specific commands found for {selected_service}.\nRefer to the README.md for detailed usage.")
    else:
        print("\n--- Available Commands ---")
        print("- help: Display this help message.")
        print("- services: List all available services for the current cloud provider.")
        print("- <service_name>: Select a service to see its specific commands (e.g., 'ec2', 'compute', 'vm').")
        print("- login: Authenticate to a cloud provider.")
        print("- back: Go back to cloud provider selection or previous service context.")
        print("- exit: Exit the CLI.")

def display_services(manager):
    print("\n--- Available Services ---")
    services = manager.get_available_services()
    for service in services:
        print(f"- {service}")

def _handle_login_command():
    print("\n--- Cloud Provider Login ---")
    print("1. AWS")
    print("2. GCP")
    print("3. Azure")
    login_choice = input("Select provider to login (1-3): ").strip()

    if login_choice == '1':
        print("\n--- AWS Login ---")
        print("Please ensure you have AWS CLI configured (e.g., `aws configure`).")
        print("Attempting to load AWS credentials...")
        if AWSConnector.login():
            print("AWS login successful.")
        else:
            print("AWS login failed. Please check the messages above.")
    elif login_choice == '2':
        print("\n--- GCP Login ---")
        print("Please ensure you have authenticated to GCP (e.g., `gcloud auth application-default login`).")
        print("Attempting to load GCP credentials...")
        if GCPConnector.login():
            print("GCP login successful.")
        else:
            print("GCP login failed. Please check the messages above.")
    elif login_choice == '3':
        print("\n--- Azure Login ---")
        print("Please ensure you have authenticated to Azure (e.g., `az login`).")
        subscription_id = input("Enter your Azure Subscription ID: ").strip()
        if not subscription_id:
            print("Azure login cancelled: Subscription ID is required.")
            return
        if AzureConnector.login(subscription_id):
            print("Azure login successful.")
        else:
            print("Azure login failed. Please check the messages above.")
    else:
        print("Invalid login choice.")

def interactive_session():
    aws_manager = AWSAgentManager()
    gcp_manager = GCPAgentManager()
    azure_manager = AzureAgentManager()

    current_provider = None
    current_manager = None
    current_service = None

    while True:
        if current_provider is None:
            print("\n--- Select Cloud Provider ---")
            print("1. AWS")
            print("2. GCP")
            print("3. Azure")
            print("4. Login to a provider")
            print("5. Exit")
            choice = input("Enter your choice (1-5): ").strip()

            if choice == '1':
                current_provider = 'aws'
                current_manager = aws_manager
                print("AWS selected. Type 'services' to list available services or 'help' for general commands.")
            elif choice == '2':
                current_provider = 'gcp'
                current_manager = gcp_manager
                print("GCP selected. Type 'services' to list available services or 'help' for general commands.")
            elif choice == '3':
                current_provider = 'azure'
                current_manager = azure_manager
                # Azure requires subscription ID to be set before manager can be fully used
                # We'll prompt for it during login or when first selecting Azure
                print("Azure selected. Remember to login with your subscription ID. Type 'services' to list available services or 'help' for general commands.")
            elif choice == '4':
                _handle_login_command()
                continue # Go back to provider selection after login attempt
            elif choice == '5':
                print("Exiting CLI. Goodbye!")
                sys.exit(0)
            else:
                print("Invalid choice. Please try again.")
                continue

        prompt = f"({current_provider.upper()}{f'/{current_service}' if current_service else ''})> "
        user_input = input(prompt).strip()

        if user_input.lower() == 'exit':
            print("Exiting CLI. Goodbye!")
            sys.exit(0)
        elif user_input.lower() == 'back':
            if current_service:
                current_service = None
                print(f"Returned to {current_provider.upper()} provider level.")
            else:
                current_provider = None
                current_manager = None
                print("Returned to cloud provider selection.")
            continue
        elif user_input.lower() == 'help':
            display_help(current_manager, current_service)
            continue
        elif user_input.lower() == 'services':
            display_services(current_manager)
            current_service = None # Reset service selection if listing all services
            continue
        elif user_input.lower() == 'login':
            _handle_login_command()
            continue
        
        # If a service is selected, try to execute a command within that service
        if current_service:
            full_command = f"{current_service} {user_input}"
            print(f"Executing: {full_command}")
            result = current_manager.execute_command(full_command)
            print("\n--- Execution Result ---")
            print(json.dumps(result, indent=4))
            print("------------------------")
        else:
            # Try to select a service or execute a direct command
            parts = shlex.split(user_input)
            if parts and parts[0] in current_manager.get_available_services():
                current_service = parts[0]
                print(f"Service '{current_service}' selected. Type 'help' to see commands for this service.")
            else:
                print(f"Executing: {user_input}")
                result = current_manager.execute_command(user_input)
                print("\n--- Execution Result ---")
                print(json.dumps(result, indent=4))
                print("------------------------")

if __name__ == "__main__":
    interactive_session()
