#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
图像生成客户端测试模块

本模块用于测试BailianImageClient类的功能，包括导入测试和方法签名测试。

作者: John Chen
创建时间: 2024
"""

import sys
import os
import inspect

# 添加包路径到sys.path，使其能够导入客户端模块
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))

def test_image_client_import():
    """
    测试图像生成客户端的导入功能
    
    验证能够正确导入BailianImageClient类和text2imagev2方法
    """
    try:
        from mcp_server_bailian_image.client import BailianImageClient, text2imagev2
        print("✓ 图像生成客户端导入成功")
        print(f"  - BailianImageClient类: {BailianImageClient}")
        print(f"  - text2imagev2方法: {text2imagev2}")
        return True
    except ImportError as e:
        print(f"✗ 图像生成客户端导入失败: {e}")
        return False

def test_image_client_methods():
    """
    测试图像生成客户端的方法签名
    
    验证BailianImageClient类和text2imagev2方法的签名是否正确
    """
    try:
        from mcp_server_bailian_image.client import BailianImageClient, text2imagev2
        
        # 测试BailianImageClient类的方法（使用虚拟API密钥避免初始化错误）
        client = BailianImageClient(api_key="test_key")
        
        # 检查text2imagev2方法是否存在
        if hasattr(client, 'text2imagev2'):
            method_sig = inspect.signature(client.text2imagev2)
            print(f"✓ BailianImageClient.text2imagev2方法签名: {method_sig}")
        else:
            print("✗ BailianImageClient.text2imagev2方法不存在")
            return False
            
        # 测试独立的text2imagev2方法
        func_sig = inspect.signature(text2imagev2)
        print(f"✓ text2imagev2函数签名: {func_sig}")
        
        return True
    except Exception as e:
        print(f"✗ 图像生成客户端方法测试失败: {e}")
        return False

def test_image_client_parameters():
    """
    测试图像生成客户端的参数验证
    
    验证方法参数的默认值和类型注解是否正确
    """
    try:
        from mcp_server_bailian_image.client import BailianImageClient
        
        client = BailianImageClient(api_key="test_key")
        method_sig = inspect.signature(client.text2imagev2)
        
        # 检查必需参数
        required_params = ['prompt']
        optional_params = ['negative_prompt', 'model', 'size', 'n', 'api_key']
        
        param_names = list(method_sig.parameters.keys())
        
        # 验证必需参数存在
        for param in required_params:
            if param in param_names:
                print(f"✓ 必需参数 '{param}' 存在")
            else:
                print(f"✗ 必需参数 '{param}' 缺失")
                return False
        
        # 验证可选参数存在（类方法不需要api_key参数，因为在初始化时已提供）
        class_optional_params = ['negative_prompt', 'model', 'size', 'n']
        for param in class_optional_params:
            if param in param_names:
                print(f"✓ 可选参数 '{param}' 存在")
            else:
                print(f"✗ 可选参数 '{param}' 缺失")
                return False
        
        # 验证类方法不应该有api_key参数（因为在初始化时已提供）
        if 'api_key' not in param_names:
            print("✓ 类方法正确地不包含 'api_key' 参数（已在初始化时提供）")
        else:
            print("✗ 类方法不应该包含 'api_key' 参数")
            return False
        
        return True
    except Exception as e:
        print(f"✗ 图像生成客户端参数测试失败: {e}")
        return False

def run_image_tests():
    """
    运行所有图像生成客户端测试
    
    返回:
        bool: 所有测试是否通过
    """
    print("=== 图像生成客户端测试 ===")
    
    tests = [
        test_image_client_import,
        test_image_client_methods,
        test_image_client_parameters
    ]
    
    results = []
    for test in tests:
        print(f"\n运行测试: {test.__name__}")
        result = test()
        results.append(result)
        print(f"测试结果: {'通过' if result else '失败'}")
    
    all_passed = all(results)
    print(f"\n=== 图像生成客户端测试总结 ===")
    print(f"总测试数: {len(tests)}")
    print(f"通过数: {sum(results)}")
    print(f"失败数: {len(tests) - sum(results)}")
    print(f"整体结果: {'全部通过' if all_passed else '存在失败'}")
    
    return all_passed

if __name__ == "__main__":
    """
    主函数：运行所有测试
    """
    success = run_image_tests()
    sys.exit(0 if success else 1)