use text_video_agent_client::apis::configuration::Configuration;
use text_video_agent_client::apis::{default_api, midjourney_api, llm_api, hedra20_api};
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建支持 HTTPS 的客户端
    let client = reqwest::Client::builder()
        .timeout(std::time::Duration::from_secs(30))
        .build()?;

    // 创建配置
    let config = Configuration {
        base_path: "https://bowongai-dev--text-video-agent-fastapi-app.modal.run".to_string(),
        user_agent: Some("text-video-agent-rust-client/1.0.6".to_string()),
        client,
        basic_auth: None,
        oauth_access_token: None,
        bearer_access_token: None,
        api_key: None,
    };

    println!("🚀 文本视频智能体 API 综合测试");
    println!("===============================");
    println!("API 地址: {}", config.base_path);
    println!();

    let mut test_results = Vec::new();

    // 1. 基础连接测试
    println!("🔗 1. 基础连接测试");
    println!("------------------");
    
    match default_api::root_get(&config).await {
        Ok(response) => {
            println!("✅ 根路径连接成功: {}", response);
            test_results.push(("根路径连接", true));
        }
        Err(e) => {
            println!("❌ 根路径连接失败: {:?}", e);
            test_results.push(("根路径连接", false));
        }
    }
    println!();

    // 2. 健康检查测试
    println!("🏥 2. 服务健康检查");
    println!("------------------");
    
    // Midjourney 健康检查
    match midjourney_api::health_check_api_mj_health_get(&config).await {
        Ok(response) => {
            println!("✅ Midjourney 服务健康: {}", response);
            test_results.push(("Midjourney 健康检查", true));
        }
        Err(e) => {
            println!("❌ Midjourney 服务异常: {:?}", e);
            test_results.push(("Midjourney 健康检查", false));
        }
    }
    println!();

    // 3. LLM 功能测试
    println!("🧠 3. 大语言模型功能测试");
    println!("------------------------");
    
    // 获取支持的模型
    match llm_api::llm_supported_models(&config).await {
        Ok(models) => {
            println!("✅ 获取模型列表成功: {}", models);
            test_results.push(("LLM 模型列表", true));
        }
        Err(e) => {
            println!("❌ 获取模型列表失败: {:?}", e);
            test_results.push(("LLM 模型列表", false));
        }
    }

    // 基础聊天测试
    match llm_api::llm_chat(
        &config,
        "请用一句话介绍人工智能",
        None,
        Some(0.7),
        Some(100),
        Some(30.0),
    ).await {
        Ok(response) => {
            println!("✅ LLM 聊天成功: {}", response);
            test_results.push(("LLM 聊天", true));
        }
        Err(e) => {
            println!("❌ LLM 聊天失败: {:?}", e);
            test_results.push(("LLM 聊天", false));
        }
    }

    // Gemini 聊天测试
    match llm_api::invoke_gemini_ai_api_llm_google_chat_post(
        &config,
        "Hello, how are you?",
        Some(30.0),
    ).await {
        Ok(response) => {
            println!("✅ Gemini 聊天成功: {}", response);
            test_results.push(("Gemini 聊天", true));
        }
        Err(e) => {
            println!("❌ Gemini 聊天失败: {:?}", e);
            test_results.push(("Gemini 聊天", false));
        }
    }
    println!();

    // 4. 图像生成测试
    println!("🎨 4. 图像生成功能测试");
    println!("----------------------");
    
    // 提示词检查
    let test_prompt = "a beautiful landscape";
    match midjourney_api::prompt_check_api_mj_prompt_check_get(&config, test_prompt).await {
        Ok(response) => {
            println!("✅ 提示词检查成功: {}", response);
            test_results.push(("提示词检查", true));
        }
        Err(e) => {
            println!("❌ 提示词检查失败: {:?}", e);
            test_results.push(("提示词检查", false));
        }
    }

    // 异步图像生成
    match midjourney_api::async_gen_image_api_mj_async_generate_image_post(
        &config,
        "a simple test image, minimalist style",
        None,
    ).await {
        Ok(response) => {
            println!("✅ 异步图像生成任务提交成功: {}", response);
            test_results.push(("异步图像生成", true));
            
            // 如果有任务ID，尝试查询状态
            if let Some(task_id) = response.get("task_id").and_then(|v| v.as_str()) {
                tokio::time::sleep(Duration::from_secs(5)).await;
                
                match midjourney_api::async_query_status_api_mj_async_query_status_get(
                    &config,
                    task_id,
                ).await {
                    Ok(status) => {
                        println!("✅ 任务状态查询成功: {}", status);
                        test_results.push(("任务状态查询", true));
                    }
                    Err(e) => {
                        println!("❌ 任务状态查询失败: {:?}", e);
                        test_results.push(("任务状态查询", false));
                    }
                }
            }
        }
        Err(e) => {
            println!("❌ 异步图像生成失败: {:?}", e);
            test_results.push(("异步图像生成", false));
        }
    }
    println!();

    // 5. Hedra 功能测试
    println!("💋 5. Hedra 唇形同步测试");
    println!("------------------------");
    
    // 注意：这里需要实际的图片和音频文件路径
    // 由于是测试，我们只测试查询任务状态功能
    match hedra20_api::query_task_status_api302_hedra_v2_task_status_get(
        &config,
        "test_task_id", // 测试任务ID
    ).await {
        Ok(response) => {
            println!("✅ Hedra 任务状态查询成功: {}", response);
            test_results.push(("Hedra 状态查询", true));
        }
        Err(e) => {
            println!("❌ Hedra 任务状态查询失败: {:?}", e);
            test_results.push(("Hedra 状态查询", false));
        }
    }
    println!();

    // 6. 性能测试
    println!("⚡ 6. 性能测试");
    println!("-------------");
    
    let start_time = std::time::Instant::now();
    let mut successful_requests = 0;
    let total_requests = 5;
    
    for i in 1..=total_requests {
        match llm_api::llm_chat(
            &config,
            &format!("这是第{}个测试请求", i),
            None,
            Some(0.5),
            Some(50),
            Some(10.0),
        ).await {
            Ok(_) => {
                successful_requests += 1;
                print!("✅");
            }
            Err(_) => {
                print!("❌");
            }
        }
        std::io::Write::flush(&mut std::io::stdout()).unwrap();
        tokio::time::sleep(Duration::from_millis(500)).await;
    }
    
    let elapsed = start_time.elapsed();
    println!();
    println!("📊 性能测试结果:");
    println!("   - 总请求数: {}", total_requests);
    println!("   - 成功请求数: {}", successful_requests);
    println!("   - 成功率: {:.1}%", (successful_requests as f64 / total_requests as f64) * 100.0);
    println!("   - 总耗时: {:.2}秒", elapsed.as_secs_f64());
    println!("   - 平均响应时间: {:.2}秒", elapsed.as_secs_f64() / total_requests as f64);
    
    test_results.push(("性能测试", successful_requests > total_requests / 2));
    println!();

    // 7. 测试结果汇总
    println!("📋 7. 测试结果汇总");
    println!("------------------");
    
    let total_tests = test_results.len();
    let passed_tests = test_results.iter().filter(|(_, passed)| *passed).count();
    
    println!("测试项目详情:");
    for (test_name, passed) in &test_results {
        let status = if *passed { "✅ 通过" } else { "❌ 失败" };
        println!("  - {}: {}", test_name, status);
    }
    
    println!();
    println!("总体结果:");
    println!("  - 总测试数: {}", total_tests);
    println!("  - 通过测试数: {}", passed_tests);
    println!("  - 通过率: {:.1}%", (passed_tests as f64 / total_tests as f64) * 100.0);
    
    if passed_tests == total_tests {
        println!("🎉 所有测试通过！API 功能正常。");
    } else if passed_tests > total_tests / 2 {
        println!("⚠️ 大部分测试通过，但有部分功能可能存在问题。");
    } else {
        println!("🚨 多数测试失败，API 可能存在严重问题。");
    }

    println!();
    println!("🎯 综合测试完成！");
    Ok(())
}
