#!/usr/bin/env python3
"""
测试配置使用情况

这个脚本会：
1. 检查 TradingAgents 核心库如何读取配置
2. 验证环境变量桥接是否有效
3. 测试 API 密钥的实际使用
"""

import os
import sys
from pathlib import Path

# 添加项目根目录到 Python 路径
sys.path.insert(0, str(Path(__file__).parent.parent))

def test_config_manager():
    """测试 ConfigManager 如何读取配置"""
    print("=" * 60)
    print("🧪 测试 1: ConfigManager 配置读取")
    print("=" * 60)
    print()
    
    from tradingagents.config.config_manager import ConfigManager
    
    # 创建 ConfigManager 实例
    config_manager = ConfigManager()
    
    # 测试 API 密钥读取
    print("📋 测试 API 密钥读取:")
    print()
    
    providers = ["dashscope", "openai", "google", "deepseek"]
    for provider in providers:
        api_key = config_manager._get_env_api_key(provider)
        if api_key:
            print(f"  ✅ {provider.upper()}_API_KEY: {api_key[:20]}... (长度: {len(api_key)})")
        else:
            print(f"  ❌ {provider.upper()}_API_KEY: 未设置")
    
    print()
    
    # 测试模型配置加载
    print("📋 测试模型配置加载:")
    print()
    
    models = config_manager.load_models()
    print(f"  加载了 {len(models)} 个模型配置")
    print()
    
    for model in models[:5]:  # 只显示前5个
        status = "✅ 启用" if model.enabled else "❌ 禁用"
        api_key_status = "有密钥" if model.api_key else "无密钥"
        print(f"  {status} | {model.provider:12} | {model.model_name:20} | {api_key_status}")
    
    if len(models) > 5:
        print(f"  ... 还有 {len(models) - 5} 个模型")
    
    print()
    
    # 测试设置加载
    print("📋 测试设置加载:")
    print()
    
    settings = config_manager.load_settings()
    print(f"  默认提供商: {settings.get('default_provider', 'N/A')}")
    print(f"  默认模型: {settings.get('default_model', 'N/A')}")
    print(f"  OpenAI 启用: {settings.get('openai_enabled', False)}")
    print()


def test_llm_adapter():
    """测试 LLM 适配器如何读取 API 密钥"""
    print("=" * 60)
    print("🧪 测试 2: LLM 适配器 API 密钥读取")
    print("=" * 60)
    print()
    
    # 测试 DashScope 适配器
    print("📋 测试 DashScope 适配器:")
    print()
    
    dashscope_key = os.getenv("DASHSCOPE_API_KEY")
    if dashscope_key:
        print(f"  ✅ DASHSCOPE_API_KEY 环境变量: {dashscope_key[:20]}... (长度: {len(dashscope_key)})")
        
        try:
            from tradingagents.llm_adapters import ChatDashScopeOpenAI
            
            # 尝试创建适配器（不实际调用 API）
            adapter = ChatDashScopeOpenAI(model="qwen-turbo")
            print(f"  ✅ ChatDashScopeOpenAI 创建成功")
            print(f"     模型: {adapter.model_name}")
            
            # 检查 API 密钥
            api_key = getattr(adapter, 'api_key', None) or getattr(adapter, 'openai_api_key', None)
            if api_key:
                # 处理 SecretStr 类型
                if hasattr(api_key, 'get_secret_value'):
                    api_key_str = api_key.get_secret_value()
                else:
                    api_key_str = str(api_key)
                print(f"     API 密钥: {api_key_str[:20]}... (长度: {len(api_key_str)})")
            else:
                print(f"     ⚠️  无法获取 API 密钥属性")
        except Exception as e:
            print(f"  ❌ ChatDashScopeOpenAI 创建失败: {e}")
    else:
        print(f"  ❌ DASHSCOPE_API_KEY 环境变量未设置")
    
    print()


def test_env_variables():
    """测试环境变量"""
    print("=" * 60)
    print("🧪 测试 3: 环境变量检查")
    print("=" * 60)
    print()
    
    # 检查 API 密钥环境变量
    print("📋 API 密钥环境变量:")
    print()
    
    api_keys = [
        "DASHSCOPE_API_KEY",
        "OPENAI_API_KEY",
        "GOOGLE_API_KEY",
        "DEEPSEEK_API_KEY",
        "ANTHROPIC_API_KEY",
    ]
    
    for key in api_keys:
        value = os.getenv(key)
        if value:
            print(f"  ✅ {key}: {value[:20]}... (长度: {len(value)})")
        else:
            print(f"  ❌ {key}: 未设置")
    
    print()
    
    # 检查模型环境变量
    print("📋 模型环境变量:")
    print()
    
    model_vars = [
        "TRADINGAGENTS_DEFAULT_MODEL",
        "TRADINGAGENTS_QUICK_MODEL",
        "TRADINGAGENTS_DEEP_MODEL",
    ]
    
    for var in model_vars:
        value = os.getenv(var)
        if value:
            print(f"  ✅ {var}: {value}")
        else:
            print(f"  ❌ {var}: 未设置")
    
    print()
    
    # 检查数据源环境变量
    print("📋 数据源环境变量:")
    print()
    
    data_source_vars = [
        "TUSHARE_TOKEN",
        "FINNHUB_API_KEY",
    ]
    
    for var in data_source_vars:
        value = os.getenv(var)
        if value:
            print(f"  ✅ {var}: {value[:20]}... (长度: {len(value)})")
        else:
            print(f"  ❌ {var}: 未设置")
    
    print()


def test_config_files():
    """测试配置文件"""
    print("=" * 60)
    print("🧪 测试 4: 配置文件检查")
    print("=" * 60)
    print()
    
    # 检查 TradingAgents 配置文件
    config_dir = Path("config")
    
    print(f"📋 配置目录: {config_dir.absolute()}")
    print()
    
    config_files = [
        "models.json",
        "settings.json",
        "pricing.json",
        "usage.json",
    ]
    
    for file in config_files:
        file_path = config_dir / file
        if file_path.exists():
            size = file_path.stat().st_size
            print(f"  ✅ {file}: 存在 ({size} 字节)")
        else:
            print(f"  ❌ {file}: 不存在")
    
    print()
    
    # 检查 .env 文件
    env_file = Path(".env")
    if env_file.exists():
        size = env_file.stat().st_size
        print(f"  ✅ .env: 存在 ({size} 字节)")
    else:
        print(f"  ❌ .env: 不存在")
    
    print()


def main():
    """主函数"""
    print()
    print("🚀 配置使用情况测试")
    print()
    
    try:
        # 测试 1: ConfigManager
        test_config_manager()
        
        # 测试 2: LLM 适配器
        test_llm_adapter()
        
        # 测试 3: 环境变量
        test_env_variables()
        
        # 测试 4: 配置文件
        test_config_files()
        
        print("=" * 60)
        print("🎯 测试完成")
        print("=" * 60)
        print()
        
        print("📝 结论:")
        print()
        print("1. ConfigManager 会从环境变量读取 API 密钥")
        print("2. LLM 适配器会使用环境变量中的 API 密钥")
        print("3. 模型名称环境变量（TRADINGAGENTS_*_MODEL）不会被使用")
        print("4. 配置文件（config/models.json）中的 api_key 会被环境变量覆盖")
        print()
        print("✅ 配置桥接对 API 密钥是有效的！")
        print("❌ 配置桥接对模型名称是无效的（但这不重要，因为模型名称通过参数传递）")
        print()
        
    except Exception as e:
        print(f"❌ 测试失败: {e}")
        import traceback
        traceback.print_exc()
        return 1
    
    return 0


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

