use tvai_sdk::TvaiSdk;
use std::fs;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("🔍 详细 FFmpeg 命令分析");
    println!("========================\n");

    let sdk = TvaiSdk::new();

    // 读取并分析 4x 慢动作模板
    let template_content = fs::read_to_string("template/4x slow motion.json")?;
    let template: tvai_sdk::Template = serde_json::from_str(&template_content)?;

    println!("📋 模板信息:");
    println!("  名称: {}", template.name);
    println!("  描述: {}", template.description);
    println!();

    // 生成基本命令
    let basic_command = sdk.generate_ffmpeg_command(&template, "input.mp4", "output.mp4")?;
    println!("🔧 基本 FFmpeg 命令:");
    println!("{}\n", basic_command);

    // 详细分析命令结构
    analyze_command_structure(&basic_command);

    // 测试不同的输入输出组合
    println!("\n📊 不同场景测试:");
    
    let test_cases = [
        ("30fps_video.mp4", "30fps_to_120fps.mp4", "30fps → 120fps (4x慢动作)"),
        ("60fps_video.mp4", "60fps_to_240fps.mp4", "60fps → 240fps (4x慢动作)"),
        ("24fps_film.mov", "24fps_to_96fps.mov", "24fps → 96fps (电影素材)"),
        ("sports_1080p.mp4", "sports_slowmo_4k.mp4", "体育视频慢动作"),
    ];

    for (input, output, description) in &test_cases {
        println!("\n  📹 {}", description);
        match sdk.generate_ffmpeg_command(&template, input, output) {
            Ok(cmd) => {
                println!("    ✓ 命令生成成功");
                analyze_specific_aspects(&cmd, &template);
            },
            Err(e) => println!("    ✗ 命令生成失败: {}", e),
        }
    }

    // 测试硬件加速版本
    println!("\n🚀 硬件加速测试:");
    test_hardware_acceleration(&sdk, &template);

    // 分析潜在问题
    println!("\n⚠️  潜在问题分析:");
    analyze_potential_issues(&basic_command, &template);

    // 提供优化建议
    println!("\n💡 优化建议:");
    provide_optimization_suggestions(&template);

    Ok(())
}

fn analyze_command_structure(command: &str) {
    println!("🏗️  命令结构分析:");
    
    let parts: Vec<&str> = command.split_whitespace().collect();
    println!("  总参数数: {}", parts.len());
    
    // 分析各个部分
    let mut i = 0;
    while i < parts.len() {
        match parts[i] {
            "ffmpeg" => println!("  [{}] 可执行文件: {}", i, parts[i]),
            "-i" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 输入文件: {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            "-vf" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 视频滤镜: {}", i, parts[i + 1]);
                    analyze_video_filter(parts[i + 1]);
                    i += 1;
                }
            },
            "-c:v" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 视频编码器: {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            "-c:a" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 音频编码器: {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            "-crf" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 视频质量 (CRF): {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            "-preset" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 编码预设: {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            "-b:a" => {
                if i + 1 < parts.len() {
                    println!("  [{}] 音频比特率: {}", i, parts[i + 1]);
                    i += 1;
                }
            },
            _ => {
                if parts[i].starts_with('"') && parts[i].ends_with('"') {
                    println!("  [{}] 输出文件: {}", i, parts[i]);
                }
            }
        }
        i += 1;
    }
}

fn analyze_video_filter(filter: &str) {
    println!("    🎛️  滤镜详细分析:");
    
    // 移除引号
    let filter = filter.trim_matches('"');
    
    if filter.contains("tvai_fi") {
        println!("      类型: TVAI 帧插值滤镜");
        
        // 解析参数
        if let Some(params_part) = filter.split("tvai_fi=").nth(1) {
            let params: Vec<&str> = params_part.split(':').collect();
            for param in params {
                if param.starts_with("model=") {
                    let model = &param[6..];
                    println!("      模型: {} ({})", model, get_model_description(model));
                } else if param.starts_with("slowmo=") {
                    let factor = &param[7..];
                    println!("      慢动作倍数: {}x", factor);
                } else if param.starts_with("rdt=") {
                    let threshold = &param[4..];
                    println!("      重复帧检测阈值: {}", threshold);
                } else if param.starts_with("fps=") {
                    let fps = &param[4..];
                    println!("      目标帧率: {} fps", fps);
                }
            }
        }
    }
}

fn get_model_description(model: &str) -> &'static str {
    match model {
        "chr-2" => "Chronos v2 - 通用帧插值模型",
        "apo-8" => "Apollo v8 - 高质量帧插值模型",
        "chf-3" => "Chronos Fast v3 - 快速帧插值模型",
        _ => "未知模型",
    }
}

fn analyze_specific_aspects(command: &str, template: &tvai_sdk::Template) {
    // 检查帧率处理
    if !command.contains("fps=") && template.settings.output.out_fps == 0.0 {
        println!("    ⚠️  未指定输出帧率，将依赖输入帧率 × 慢动作倍数");
    }
    
    // 检查质量设置
    if command.contains("-crf 23") {
        println!("    ✓ 使用中等质量设置 (CRF 23)");
    }
    
    // 检查编码器选择
    if command.contains("libx264") {
        println!("    ℹ️  使用软件 H.264 编码器 (兼容性好，速度较慢)");
    }
    
    // 检查音频处理
    if command.contains("-c:a aac") {
        println!("    ✓ 使用 AAC 音频编码器 (广泛兼容)");
    }
}

fn test_hardware_acceleration(sdk: &TvaiSdk, template: &tvai_sdk::Template) {
    let hw_tests = [
        ("windows", Some("nvidia"), "NVIDIA GPU"),
        ("osx", Some("appleIntel"), "Apple VideoToolbox"),
        ("windows", Some("amd"), "AMD GPU"),
    ];

    for (os, gpu, desc) in &hw_tests {
        match sdk.ffmpeg_generator.generate_with_auto_encoder(template, "input.mp4", "output.mp4", os, *gpu) {
            Ok(cmd) => {
                println!("  ✓ {} 硬件加速:", desc);
                if cmd.contains("nvenc") {
                    println!("    使用 NVIDIA NVENC 编码器");
                } else if cmd.contains("videotoolbox") {
                    println!("    使用 Apple VideoToolbox 编码器");
                } else if cmd.contains("amf") {
                    println!("    使用 AMD AMF 编码器");
                }
            },
            Err(e) => println!("  ✗ {} 硬件加速失败: {}", desc, e),
        }
    }
}

fn analyze_potential_issues(command: &str, template: &tvai_sdk::Template) {
    let mut issues: Vec<&str> = Vec::new();
    let mut warnings: Vec<&str> = Vec::new();

    // 检查帧率问题
    if template.settings.slow_motion.factor == 4.0 && !command.contains("fps=") {
        warnings.push("4倍慢动作但未明确指定输出帧率，可能导致帧率不符合预期");
    }

    // 检查存储空间问题
    if template.settings.slow_motion.factor >= 4.0 {
        warnings.push("4倍慢动作会显著增加文件大小，请确保有足够存储空间");
    }

    // 检查性能问题
    if command.contains("libx264") && !command.contains("preset fast") {
        warnings.push("使用软件编码器且未设置快速预设，编码时间可能较长");
    }

    // 检查兼容性问题
    if !command.contains("-pix_fmt") {
        warnings.push("未明确指定像素格式，可能在某些播放器上出现兼容性问题");
    }

    // 输出结果
    if issues.is_empty() && warnings.is_empty() {
        println!("  ✅ 未发现明显问题");
    } else {
        for issue in issues {
            println!("  ❌ 问题: {}", issue);
        }
        for warning in warnings {
            println!("  ⚠️  警告: {}", warning);
        }
    }
}

fn provide_optimization_suggestions(template: &tvai_sdk::Template) {
    println!("  🎯 针对 4倍慢动作的优化建议:");
    
    println!("  1. 帧率设置:");
    println!("     - 建议明确设置输出帧率，如 30fps → 120fps");
    println!("     - 避免过高的输出帧率以减少文件大小");
    
    println!("  2. 编码器选择:");
    println!("     - 优先使用硬件编码器 (NVENC/VideoToolbox/AMF) 提升速度");
    println!("     - 考虑使用 H.265 编码器减少文件大小");
    
    println!("  3. 质量设置:");
    println!("     - 慢动作视频建议使用较高质量 (CRF 18-20)");
    println!("     - 可以适当降低音频比特率节省空间");
    
    println!("  4. 性能优化:");
    println!("     - 使用 SSD 存储提升 I/O 性能");
    println!("     - 确保有足够内存处理高帧率视频");
    
    if template.settings.slow_motion.duplicate {
        println!("  5. 重复帧处理:");
        println!("     - 当前启用重复帧检测，有助于提升质量");
        println!("     - 阈值设置为 {} (推荐范围: 5-15)", template.settings.slow_motion.duplicate_threshold);
    }
}
