use text_video_agent_client::apis::configuration::Configuration;
use text_video_agent_client::apis::llm_api;
use std::path::PathBuf;
use std::fs;

#[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!("📁 文件上传和媒体分析测试");
    println!("==========================");
    println!("API 地址: {}", config.base_path);
    println!();

    // 创建一个测试文本文件
    let test_file_path = "test_file.txt";
    let test_content = "这是一个测试文件，用于验证文件上传功能。\nThis is a test file for verifying file upload functionality.";
    
    println!("📝 创建测试文件: {}", test_file_path);
    fs::write(test_file_path, test_content)?;
    println!("✅ 测试文件创建成功");
    println!();

    // 1. 测试文件上传到 Google 存储
    println!("☁️ 测试文件上传到 Google 存储...");
    let file_path = PathBuf::from(test_file_path);
    
    match llm_api::google_file_upload(&config, file_path.clone()).await {
        Ok(response) => {
            println!("✅ 文件上传成功: {}", response);
            
            // 尝试从响应中提取文件URI
            if let Some(data) = response.get("data").and_then(|v| v.as_str()) {
                println!("📎 文件URI: {}", data);
                
                // 2. 使用上传的文件进行媒体分析
                println!();
                println!("🔍 测试媒体分析（同步）...");
                
                let analysis_prompts = vec![
                    "请分析这个文件的内容",
                    "这个文件包含什么信息？",
                    "请总结文件的主要内容",
                ];
                
                for (i, prompt) in analysis_prompts.iter().enumerate() {
                    println!("🔸 分析 {}: {}", i + 1, prompt);
                    
                    match llm_api::invoke_media_analysis_api_llm_google_sync_media_analysis_post(
                        &config,
                        prompt,
                        data, // 使用上传后的文件URI
                    ).await {
                        Ok(analysis_response) => {
                            println!("✅ 分析结果: {}", analysis_response);
                        }
                        Err(e) => {
                            println!("❌ 分析失败: {:?}", e);
                        }
                    }
                    println!();
                    
                    // 添加延迟
                    tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
                }
                
                // 3. 测试异步媒体分析
                println!("⚡ 测试媒体分析（异步）...");
                let async_prompt = "请详细分析这个文件，包括语言、内容主题和结构";
                
                match llm_api::submit_media_inference_api_llm_google_async_media_analysis_post(
                    &config,
                    async_prompt,
                    data,
                ).await {
                    Ok(async_response) => {
                        println!("✅ 异步分析任务提交成功: {}", async_response);
                        
                        // 尝试获取任务ID
                        if let Some(task_id) = async_response.get("task_id").and_then(|v| v.as_str()) {
                            println!("📋 任务ID: {}", task_id);
                            
                            // 轮询任务状态
                            println!("⏳ 查询任务状态...");
                            for attempt in 1..=5 {
                                tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
                                
                                match llm_api::llm_task_id(&config, task_id).await {
                                    Ok(status_response) => {
                                        println!("📊 第{}次查询 - 任务状态: {}", attempt, status_response);
                                        
                                        // 检查任务是否完成
                                        if let Some(status) = status_response.get("status") {
                                            if status.is_boolean() && status.as_bool() == Some(true) {
                                                println!("🎉 异步分析任务完成！");
                                                if let Some(data) = status_response.get("data") {
                                                    println!("📄 分析结果: {}", data);
                                                }
                                                break;
                                            }
                                        }
                                    }
                                    Err(e) => {
                                        println!("❌ 查询状态失败: {:?}", e);
                                    }
                                }
                            }
                        }
                    }
                    Err(e) => {
                        println!("❌ 异步分析任务提交失败: {:?}", e);
                    }
                }
            }
        }
        Err(e) => {
            println!("❌ 文件上传失败: {:?}", e);
        }
    }
    println!();

    // 4. 测试不同类型的媒体URI分析
    println!("🌐 测试在线媒体分析...");
    let online_media_tests = vec![
        ("https://example.com/sample.jpg", "请描述这张图片的内容"),
        ("https://example.com/sample.mp4", "请分析这个视频的主要内容"),
        ("https://example.com/sample.mp3", "请分析这个音频文件"),
    ];
    
    for (media_uri, prompt) in online_media_tests.iter() {
        println!("🔗 分析媒体: {}", media_uri);
        println!("❓ 提示: {}", prompt);
        
        match llm_api::invoke_media_analysis_api_llm_google_sync_media_analysis_post(
            &config,
            prompt,
            media_uri,
        ).await {
            Ok(response) => {
                println!("✅ 分析结果: {}", response);
            }
            Err(e) => {
                println!("❌ 分析失败: {:?}", e);
            }
        }
        println!();
        
        tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
    }

    // 清理测试文件
    println!("🧹 清理测试文件...");
    if let Err(e) = fs::remove_file(test_file_path) {
        println!("⚠️ 删除测试文件失败: {}", e);
    } else {
        println!("✅ 测试文件已删除");
    }

    println!("🎯 文件上传和媒体分析测试完成！");
    Ok(())
}
