#!/usr/bin/env python3
"""
修复vn.py模块导入问题
解决"No module named 'vnpy.app'"错误
"""

import os
import sys

def check_vnpy_structure():
    """检查vn.py模块结构"""
    print("检查vn.py模块结构...")
    
    try:
        import vnpy
        print(f"✅ vnpy版本: {getattr(vnpy, '__version__', '未知')}")
        
        # 检查模块路径
        vnpy_path = vnpy.__file__
        vnpy_dir = os.path.dirname(vnpy_path)
        
        print(f"vn.py路径: {vnpy_path}")
        print(f"vn.py目录: {vnpy_dir}")
        
        # 列出所有子模块
        if os.path.exists(vnpy_dir):
            submodules = []
            for item in os.listdir(vnpy_dir):
                item_path = os.path.join(vnpy_dir, item)
                if os.path.isdir(item_path) and not item.startswith('_'):
                    submodules.append(item)
            
            print(f"vn.py子模块: {submodules}")
            return submodules
        else:
            print("❌ vn.py目录不存在")
            return []
            
    except ImportError as e:
        print(f"❌ 无法导入vnpy: {e}")
        return []

def check_imports():
    """检查常见的vn.py导入"""
    print("\n检查vn.py模块导入...")
    
    imports_to_check = [
        # 核心模块
        ('vnpy', '✅ vnpy核心模块'),
        ('vnpy.trader', '✅ vnpy.trader模块'),
        ('vnpy.event', '✅ vnpy.event模块'),
        ('vnpy.trader.engine', '✅ vnpy.trader.engine模块'),
        
        # 应用模块（可能不存在）
        ('vnpy.app', '❌ vnpy.app模块（可能已废弃）'),
        ('vnpy.trader.app', '✅ vnpy.trader.app模块'),
        
        # 策略模块
        ('vnpy_ctastrategy', '✅ vnpy_ctastrategy模块'),
        ('vnpy_ctabacktester', '✅ vnpy_ctabacktester模块'),
        
        # 其他组件
        ('vnpy_webtrader', '✅ vnpy_webtrader模块'),
        ('vnpy_datamanager', '✅ vnpy_datamanager模块'),
    ]
    
    results = []
    for import_str, description in imports_to_check:
        try:
            __import__(import_str)
            results.append((import_str, description.replace('❌', '✅').replace('（可能已废弃）', '')))
        except ImportError as e:
            results.append((import_str, f"{description}: {e}"))
    
    for import_str, result in results:
        print(f"{result}")
    
    return results

def create_import_fix_guide():
    """创建导入修复指南"""
    print("\n" + "="*60)
    print("vn.py 4.x版本导入修复指南")
    print("="*60)
    
    guide = """
## 问题: 无法导入 vnpy.app

### 原因:
vn.py 4.x版本中，模块结构发生了变化：
- vn.py 3.x: 使用 `vnpy.app.xxx` 格式
- vn.py 4.x: 使用 `vnpy_xxx` 或 `vnpy.trader.app` 格式

### 解决方案:

#### 1. 替换导入语句
```python
# ❌ 旧版本 (vn.py 3.x)
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_backtester import CtaBacktesterApp

# ✅ 新版本 (vn.py 4.x)
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
```

#### 2. 使用正确的模块路径
```python
# ❌ 错误
import vnpy.app

# ✅ 正确
import vnpy.trader.app  # 如果存在
import vnpy_ctastrategy  # 策略应用
import vnpy_ctabacktester  # 回测应用
```

#### 3. 检查并更新代码
如果代码中使用了 `vnpy.app`，需要更新为：
```python
# 查找并替换
- vnpy.app. → vnpy_  # 大部分情况
- vnpy.app → vnpy.trader  # 少数情况
```

#### 4. 验证修复
```python
# 测试新导入
try:
    from vnpy_ctastrategy import CtaTemplate
    print("✅ vnpy_ctastrategy 导入成功")
except ImportError as e:
    print(f"❌ 导入失败: {e}")
    # 安装缺失模块
    # pip install vnpy-ctastrategy
```
"""
    
    print(guide)
    
    # 创建修复脚本示例
    fix_script = '''#!/usr/bin/env python3
"""
vn.py 4.x 兼容性修复脚本
"""

import os
import re

def fix_vnpy_imports(file_path):
    """修复文件中的vn.py导入"""
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 替换规则
    replacements = [
        (r'from vnpy\.app\.', 'from vnpy_'),
        (r'import vnpy\.app\.', 'import vnpy_'),
        (r'vnpy\.app\.cta_strategy', 'vnpy_ctastrategy'),
        (r'vnpy\.app\.cta_backtester', 'vnpy_ctabacktester'),
        (r'vnpy\.app\.data_manager', 'vnpy_datamanager'),
        (r'vnpy\.app\.rpc_service', 'vnpy_rpcservice'),
        (r'vnpy\.app\.algo_trading', 'vnpy_algotrading'),
    ]
    
    fixed_content = content
    for pattern, replacement in replacements:
        fixed_content = re.sub(pattern, replacement, fixed_content)
    
    if fixed_content != content:
        # 备份原文件
        backup_path = file_path + '.backup'
        os.rename(file_path, backup_path)
        
        # 写入修复后的文件
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(fixed_content)
        
        print(f"✅ 已修复: {file_path}")
        print(f"   备份: {backup_path}")
        return True
    else:
        print(f"✅ 无需修复: {file_path}")
        return False

# 使用示例
if __name__ == "__main__":
    # 修复当前目录下的Python文件
    for root, dirs, files in os.walk('.'):
        for file in files:
            if file.endswith('.py'):
                file_path = os.path.join(root, file)
                fix_vnpy_imports(file_path)
'''
    
    fix_script_path = "fix_vnpy_imports_script.py"
    with open(fix_script_path, 'w', encoding='utf-8') as f:
        f.write(fix_script)
    
    print(f"✅ 已创建修复脚本: {fix_script_path}")
    print(f"使用方式: python {fix_script_path}")

def main():
    """主函数"""
    print("🚀 开始诊断vn.py模块导入问题")
    print("="*60)
    
    # 检查vn.py结构
    submodules = check_vnpy_structure()
    
    # 检查导入
    results = check_imports()
    
    # 创建修复指南
    create_import_fix_guide()
    
    print("\n" + "="*60)
    print("诊断完成")
    print("="*60)
    
    # 总结
    missing_app = any('vnpy.app' in result[0] and '❌' in result[1] for result in results)
    if missing_app:
        print("🎯 问题确认: vnpy.app模块缺失")
        print("解决方案:")
        print("1. 更新代码使用vn.py 4.x兼容的导入")
        print("2. 或降级vn.py到3.x版本")
        print("3. 建议使用方案1（更新代码）")
    else:
        print("✅ 所有vn.py模块导入正常")

if __name__ == "__main__":
    main()