#!/usr/bin/env python3
"""
测试直接导入方式的视频拆分服务
验证类型安全和简洁性
"""

import sys
from pathlib import Path

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

def test_direct_import():
    """测试直接导入"""
    print("🔍 测试直接导入方式")
    print("=" * 50)
    
    try:
        # 直接导入，如果依赖不存在就立即失败
        from python_core.services.video_splitter import VideoSplitterService, DetectionConfig, DetectorType
        print("✅ 模块导入成功")
        
        # 测试类型提示
        service: VideoSplitterService = VideoSplitterService()
        print("✅ 类型提示正常工作")
        
        # 测试配置创建
        config: DetectionConfig = DetectionConfig(
            threshold=30.0,
            detector_type=DetectorType.CONTENT
        )
        print("✅ 配置创建成功，类型安全")
        
        return True
        
    except ImportError as e:
        print(f"❌ 导入失败（这是预期的，如果依赖不存在）: {e}")
        # 检查错误信息是否明确
        if "scenedetect" in str(e).lower():
            print("✅ 错误信息明确指出了缺失的依赖")
            return True
        else:
            print("⚠️ 错误信息可能不够明确")
            return False
    except Exception as e:
        print(f"❌ 意外错误: {e}")
        return False

def test_type_safety():
    """测试类型安全"""
    print("\n🔒 测试类型安全")
    print("=" * 50)
    
    try:
        # 检查PySceneDetect
        try:
            import scenedetect
            print(f"✅ PySceneDetect {scenedetect.__version__} 可用")
        except ImportError:
            print("⚠️ PySceneDetect不可用，跳过类型安全测试")
            return True
        
        from python_core.services.video_splitter.detectors import PySceneDetectDetector
        from python_core.services.video_splitter.types import DetectionConfig, DetectorType
        
        # 测试检测器创建
        detector = PySceneDetectDetector()
        print("✅ 检测器创建成功")
        
        # 测试类型提示在IDE中的工作
        # 这些应该有完整的类型提示
        config = DetectionConfig(threshold=25.0)
        print(f"✅ 配置类型: {type(config)}")
        print(f"   阈值: {config.threshold}")
        print(f"   检测器类型: {config.detector_type}")
        print(f"   最小场景长度: {config.min_scene_length}")
        
        # 测试枚举类型
        content_type = DetectorType.CONTENT
        threshold_type = DetectorType.THRESHOLD
        print(f"✅ 枚举类型工作正常: {content_type.value}, {threshold_type.value}")
        
        return True
        
    except Exception as e:
        print(f"❌ 类型安全测试失败: {e}")
        return False

def test_functionality():
    """测试功能"""
    print("\n🎯 测试功能")
    print("=" * 50)
    
    try:
        # 检查依赖
        try:
            import scenedetect
        except ImportError:
            print("⚠️ PySceneDetect不可用，跳过功能测试")
            return True
        
        from python_core.services.video_splitter import VideoSplitterService, DetectionConfig
        
        # 查找测试视频
        assets_dir = project_root / "assets"
        video_files = list(assets_dir.rglob("*.mp4"))
        
        if not video_files:
            print("⚠️ 没有找到测试视频，跳过功能测试")
            return True
        
        test_video = str(video_files[0])
        print(f"📹 测试视频: {test_video}")
        
        # 创建服务
        service = VideoSplitterService()
        print("✅ 服务创建成功")
        
        # 测试分析
        config = DetectionConfig(threshold=30.0)
        result = service.analyze_video(test_video, config)
        
        if result.success:
            print(f"✅ 视频分析成功:")
            print(f"   总场景数: {result.total_scenes}")
            print(f"   总时长: {result.total_duration:.2f}秒")
            print(f"   分析时间: {result.analysis_time:.2f}秒")
            
            # 验证场景数据类型
            for i, scene in enumerate(result.scenes[:2]):  # 只显示前2个
                print(f"   场景 {scene.scene_number}: {scene.start_time:.2f}s - {scene.end_time:.2f}s")
                # 验证类型
                assert isinstance(scene.scene_number, int)
                assert isinstance(scene.start_time, float)
                assert isinstance(scene.end_time, float)
            
            print("✅ 场景数据类型验证通过")
        else:
            print(f"❌ 视频分析失败: {result.error}")
            return False
        
        return True
        
    except Exception as e:
        print(f"❌ 功能测试失败: {e}")
        import traceback
        traceback.print_exc()
        return False

def test_code_simplicity():
    """测试代码简洁性"""
    print("\n📝 测试代码简洁性")
    print("=" * 50)
    
    try:
        # 检查文件大小和复杂度
        module_dir = project_root / "python_core" / "services" / "video_splitter"
        
        files_to_check = ["detectors.py", "service.py", "cli.py"]
        
        for file_name in files_to_check:
            file_path = module_dir / file_name
            if file_path.exists():
                content = file_path.read_text()
                lines = content.splitlines()
                
                # 统计代码行数（排除空行和注释）
                code_lines = [line for line in lines if line.strip() and not line.strip().startswith('#')]
                
                print(f"✅ {file_name}:")
                print(f"   总行数: {len(lines)}")
                print(f"   代码行数: {len(code_lines)}")
                
                # 检查是否有复杂的条件逻辑
                complex_patterns = ['if UTILS_AVAILABLE', 'try:', 'except ImportError', 'AVAILABLE = True']
                complex_count = sum(1 for line in lines if any(pattern in line for pattern in complex_patterns))
                
                if complex_count == 0:
                    print(f"   ✅ 没有复杂的降级逻辑")
                else:
                    print(f"   ⚠️ 仍有 {complex_count} 行复杂逻辑")
        
        return True
        
    except Exception as e:
        print(f"❌ 代码简洁性测试失败: {e}")
        return False

def main():
    """主函数"""
    print("🚀 测试直接导入方式的视频拆分服务")
    print("验证类型安全和代码简洁性")
    
    try:
        # 运行所有测试
        tests = [
            test_direct_import,
            test_type_safety,
            test_functionality,
            test_code_simplicity
        ]
        
        results = []
        for test in tests:
            try:
                result = test()
                results.append(result)
            except Exception as e:
                print(f"❌ 测试 {test.__name__} 异常: {e}")
                results.append(False)
        
        # 总结
        print("\n" + "=" * 60)
        print("📊 直接导入测试总结")
        print("=" * 60)
        
        passed = sum(results)
        total = len(results)
        
        print(f"通过测试: {passed}/{total}")
        
        if passed == total:
            print("🎉 所有直接导入测试通过！")
            print("\n✅ 直接导入的优势:")
            print("   1. 类型安全 - 完整的类型提示和IDE支持")
            print("   2. 代码简洁 - 移除了复杂的依赖检查逻辑")
            print("   3. 明确失败 - 依赖问题立即暴露")
            print("   4. 易于理解 - 代码逻辑清晰直观")
            print("   5. 性能更好 - 没有运行时的条件判断")
            
            print("\n🔧 代码质量改进:")
            print("   1. 移除了 try/except ImportError 逻辑")
            print("   2. 移除了 AVAILABLE 标志变量")
            print("   3. 移除了条件导入和字典访问")
            print("   4. 保持了完整的类型信息")
            print("   5. IDE 可以提供完整的自动补全")
            
            print("\n📝 使用方式:")
            print("   # 直接导入，类型安全")
            print("   from python_core.services.video_splitter import VideoSplitterService")
            print("   service = VideoSplitterService()  # 有完整类型提示")
            
            return 0
        else:
            print("⚠️ 部分直接导入测试失败")
            return 1
            
    except Exception as e:
        print(f"❌ 测试过程中出错: {e}")
        import traceback
        traceback.print_exc()
        return 1

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