use tvai_sdk::{TvaiSdk, TemplateBuilder};

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_audio_codec_loading() {
        let sdk = TvaiSdk::new();
        let audio_codecs = sdk.ffmpeg_generator.get_available_audio_codecs();

        // 检查是否加载了内置音频编解码器
        assert!(!audio_codecs.is_empty(), "应该加载内置音频编解码器配置");

        // 检查 AAC 编解码器
        let aac_codec = sdk.ffmpeg_generator.get_audio_codec("AAC");
        assert!(aac_codec.is_some(), "应该找到 AAC 编解码器");

        if let Some(aac) = aac_codec {
            assert_eq!(aac.name, "AAC");
            assert!(aac.ffmpeg_opts.contains("aac"), "AAC 编解码器应该包含 'aac' 选项");
            assert!(aac.ext.contains(&"mp4".to_string()), "AAC 应该支持 MP4 格式");
        }
    }

    #[test]
    fn test_video_encoder_loading() {
        let sdk = TvaiSdk::new();
        let video_encoders = sdk.ffmpeg_generator.get_available_video_encoders();

        // 检查是否加载了内置视频编码器
        assert!(!video_encoders.is_empty(), "应该加载内置视频编码器配置");

        // 检查 H.264 编码器
        let h264_encoder = sdk.ffmpeg_generator.get_video_encoder_by_name("H264");
        assert!(h264_encoder.is_some(), "应该找到 H.264 编码器");
    }

    #[test]
    fn test_model_recommendation() {
        let sdk = TvaiSdk::new();
        
        // 测试不同分辨率的模型推荐
        let recommendations_480p = sdk.ffmpeg_generator.recommend_model_for_resolution(480);
        assert!(!recommendations_480p.is_empty(), "480p 应该有模型推荐");
        
        let recommendations_1080p = sdk.ffmpeg_generator.recommend_model_for_resolution(1080);
        assert!(!recommendations_1080p.is_empty(), "1080p 应该有模型推荐");
        
        let recommendations_4k = sdk.ffmpeg_generator.recommend_model_for_resolution(2160);
        assert!(!recommendations_4k.is_empty(), "4K 应该有模型推荐");
    }

    #[test]
    fn test_audio_codec_params_generation() {
        let sdk = TvaiSdk::new();
        
        // 测试 AAC 编解码器参数生成
        let aac_params = sdk.ffmpeg_generator.generate_audio_codec_params("AAC", Some(192));
        assert!(aac_params.contains("-c:a"), "应该包含音频编解码器参数");
        assert!(aac_params.contains("192"), "应该包含指定的比特率");
        
        // 测试不存在的编解码器
        let unknown_params = sdk.ffmpeg_generator.generate_audio_codec_params("UNKNOWN", Some(128));
        assert!(unknown_params.contains("-c:a UNKNOWN"), "应该回退到默认格式");
    }

    #[test]
    fn test_compatibility_filtering() {
        let sdk = TvaiSdk::new();
        
        // 测试 Windows 兼容性筛选
        let windows_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("windows", None);
        assert!(!windows_encoders.is_empty(), "应该有 Windows 兼容的编码器");
        
        // 测试 macOS 兼容性筛选
        let macos_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("osx", None);
        assert!(!macos_encoders.is_empty(), "应该有 macOS 兼容的编码器");
        
        // 测试 GPU 筛选
        let _nvidia_encoders = sdk.ffmpeg_generator.get_compatible_video_encoders("windows", Some("nvidia"));
        // 注意：这个测试可能为空，因为需要特定的配置
        
        // 测试文件扩展名筛选
        let mp4_encoders = sdk.ffmpeg_generator.get_encoders_for_extension("mp4");
        assert!(!mp4_encoders.is_empty(), "应该有支持 MP4 的编码器");
    }

    #[test]
    fn test_auto_encoder_selection() {
        let sdk = TvaiSdk::new();
        
        // 创建测试模板
        let template = TemplateBuilder::new("测试模板")
            .enable_enhancement("prob-4")
            .build()
            .expect("应该能创建测试模板");
        
        // 测试自动编码器选择
        let result = sdk.ffmpeg_generator.generate_with_auto_encoder(
            &template, 
            "input.mp4", 
            "output.mp4", 
            "windows", 
            Some("nvidia")
        );
        
        // 这个测试可能失败，因为需要特定的编码器配置
        // 但至少应该返回一个结果（成功或特定的错误）
        assert!(result.is_ok() || result.is_err(), "应该返回结果");
    }

    #[test]
    fn test_ffmpeg_command_with_config() {
        let sdk = TvaiSdk::new();
        
        // 创建使用配置文件的模板
        let template = TemplateBuilder::new("配置文件测试")
            .enable_enhancement("prob-4")
            .video_codec("H264", Some(23))
            .audio_settings("AAC", 192, 2)
            .build()
            .expect("应该能创建模板");
        
        // 生成 FFmpeg 命令
        let command = sdk.generate_ffmpeg_command(&template, "input.mp4", "output.mp4")
            .expect("应该能生成 FFmpeg 命令");
        
        // 验证命令包含预期的元素
        assert!(command.contains("ffmpeg"), "应该包含 ffmpeg");
        assert!(command.contains("-i"), "应该包含输入参数");
        assert!(command.contains("tvai_up"), "应该包含 TVAI 增强滤镜");
        assert!(command.contains("-c:a"), "应该包含音频编解码器");
    }

    #[test]
    fn test_encoder_report_generation() {
        let sdk = TvaiSdk::new();
        
        let report = sdk.ffmpeg_generator.generate_encoder_report();
        
        // 验证报告包含预期的内容
        assert!(report.contains("可用编码器报告"), "应该包含报告标题");
        assert!(report.contains("音频编解码器"), "应该包含音频编解码器部分");
        
        // 如果有编码器配置，应该包含编码器信息
        if !sdk.ffmpeg_generator.get_available_video_encoders().is_empty() {
            assert!(report.len() > 100, "报告应该有实质内容");
        }
    }

    #[test]
    fn test_bitrate_config_usage() {
        let sdk = TvaiSdk::new();
        
        // 测试 AAC 编解码器的比特率配置
        if let Some(aac_codec) = sdk.ffmpeg_generator.get_audio_codec("AAC") {
            if let Some(bitrate_config) = &aac_codec.bitrate {
                assert!(bitrate_config.min > 0, "最小比特率应该大于 0");
                assert!(bitrate_config.max > bitrate_config.min, "最大比特率应该大于最小比特率");
                assert!(!bitrate_config.suggested.is_empty(), "应该有建议的比特率值");
                assert!(bitrate_config.ffmpeg_opt.contains("<BITRATE>"), "应该包含比特率占位符");
            }
        }
    }

    #[test]
    fn test_video_encoder_quality_modes() {
        let sdk = TvaiSdk::new();
        
        // 查找支持质量模式的编码器
        for encoder in sdk.ffmpeg_generator.get_available_video_encoders() {
            if let Some(bitrate_opts) = &encoder.bitrate_opts {
                if bitrate_opts.cbr.is_some() {
                    assert!(bitrate_opts.cbr.as_ref().unwrap().contains("<CONST_BITRATE_VALUE>"), 
                           "CBR 模板应该包含比特率占位符");
                }
                
                if bitrate_opts.vbr.is_some() {
                    let vbr_template = bitrate_opts.vbr.as_ref().unwrap();
                    assert!(vbr_template.contains("<QP_VALUE>") || 
                           vbr_template.contains("<QPI_VALUE>") ||
                           vbr_template.contains("<QV_VALUE>"), 
                           "VBR 模板应该包含质量占位符");
                }
            }
        }
    }
}
