#!/usr/bin/env python3
"""
Test script for Vultr MCP Server
"""
import sys
import os
import json
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from src.vultr_mcp.server import app
from fastapi.testclient import TestClient

# Create test client
client = TestClient(app)

def test_root_endpoint():
    """Test root endpoint"""
    print("Testing root endpoint...")
    response = client.get("/")
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"
    data = response.json()
    assert "name" in data, "Missing 'name' in response"
    assert "Vultr MCP Server" in data["name"], f"Unexpected name: {data.get('name')}"
    print(f"  ✓ Root endpoint: {data['name']} v{data.get('version', 'N/A')}")
    return True

def test_tools_endpoint():
    """Test tools endpoint"""
    print("\nTesting tools endpoint...")
    response = client.get("/tools")
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"
    tools = response.json()
    assert isinstance(tools, list), f"Expected list, got {type(tools)}"
    assert len(tools) > 0, "No tools found"
    
    print(f"  ✓ Found {len(tools)} tools:")
    for i, tool in enumerate(tools[:5], 1):  # Show first 5
        print(f"    {i}. {tool['name']}: {tool['description'][:50]}...")
    if len(tools) > 5:
        print(f"    ... and {len(tools) - 5} more")
    
    # Verify some expected tools
    tool_names = [t['name'] for t in tools]
    expected_tools = ['get_account_info', 'list_instances', 'create_instance']
    for expected in expected_tools:
        assert expected in tool_names, f"Missing expected tool: {expected}"
    
    return True

def test_resources_endpoint():
    """Test resources endpoint"""
    print("\nTesting resources endpoint...")
    response = client.get("/resources")
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"
    resources = response.json()
    assert isinstance(resources, list), f"Expected list, got {type(resources)}"
    
    print(f"  ✓ Found {len(resources)} resources:")
    for resource in resources:
        print(f"    - {resource['name']}: {resource['uri']}")
    
    return True

def test_prompts_endpoint():
    """Test prompts endpoint"""
    print("\nTesting prompts endpoint...")
    response = client.get("/prompts")
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"
    prompts = response.json()
    assert isinstance(prompts, list), f"Expected list, got {type(prompts)}"
    
    print(f"  ✓ Found {len(prompts)} prompts:")
    for prompt in prompts:
        print(f"    - {prompt['name']}: {prompt['description']}")
    
    return True

def test_tool_call_without_api_key():
    """Test tool call without API key (should fail gracefully)"""
    print("\nTesting tool call without API key...")
    response = client.post("/tools/call", json={
        "name": "get_account_info",
        "arguments": {}
    })
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"
    result = response.json()
    
    # Should either be an error or contain content
    assert "content" in result, "Missing 'content' in response"
    assert isinstance(result["content"], list), "Content should be a list"
    
    if result.get("isError", False):
        print("  ✓ Tool call correctly returned error (no API key configured)")
        if result["content"]:
            error_text = result["content"][0].get("text", "")
            print(f"    Error message: {error_text[:100]}...")
    else:
        print("  ✓ Tool call succeeded (API key might be configured)")
    
    return True

def test_server_info_endpoints():
    """Test that server info endpoints work"""
    print("\nTesting server info endpoints...")
    
    # Test that we can get the OpenAPI schema
    response = client.get("/openapi.json")
    assert response.status_code == 200, f"OpenAPI schema failed: {response.status_code}"
    print("  ✓ OpenAPI schema available")
    
    # Test docs endpoint
    response = client.get("/docs")
    assert response.status_code == 200, f"Docs endpoint failed: {response.status_code}"
    print("  ✓ API documentation available")
    
    return True

def main():
    """Run all tests"""
    print("=" * 60)
    print("Vultr MCP Server - Test Suite")
    print("=" * 60)
    print("Note: These tests don't require a Vultr API key")
    print("      They only test the server structure and endpoints\n")
    
    tests = [
        test_root_endpoint,
        test_tools_endpoint,
        test_resources_endpoint,
        test_prompts_endpoint,
        test_tool_call_without_api_key,
        test_server_info_endpoints,
    ]
    
    passed = 0
    failed = 0
    failed_tests = []
    
    for test in tests:
        try:
            if test():
                passed += 1
        except AssertionError as e:
            print(f"  ✗ Test failed: {e}")
            failed += 1
            failed_tests.append(test.__name__)
        except Exception as e:
            print(f"  ✗ Unexpected error in {test.__name__}: {e}")
            failed += 1
            failed_tests.append(test.__name__)
    
    print("\n" + "=" * 60)
    print("TEST RESULTS")
    print("=" * 60)
    print(f"Passed: {passed}")
    print(f"Failed: {failed}")
    
    if failed == 0:
        print("\n✅ All tests passed! Server is ready to run.")
        print("\nNext steps:")
        print("  1. Copy .env.example to .env")
        print("  2. Add your VULTR_API_KEY to .env")
        print("  3. Run the server: python main.py")
        print("  4. Test with example: python examples/basic_usage.py")
        return 0
    else:
        print(f"\n❌ {failed} test(s) failed: {', '.join(failed_tests)}")
        print("\nCheck the implementation and try again.")
        return 1

if __name__ == "__main__":
    sys.exit(main())

