// Copyright 2025 SkyReels SDK Contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! JSON 输出示例 - 展示如何输出 API 返回的 JSON 数据
//!
//! 这个示例演示如何：
//! - 启用调试日志查看原始 JSON 响应
//! - 使用 to_json() 和 pretty_print() 方法格式化输出
//! - 保存 JSON 响应到文件

use skyreels::{SkyReelsClient, TaskStatus};
use tracing::{info, warn};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 加载环境变量
    dotenv::dotenv().ok();

    // 启用调试日志以查看原始 JSON 响应
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::DEBUG)
        .init();

    let api_key = std::env::var("SKYREELS_API_KEY")
        .expect("SKYREELS_API_KEY environment variable not set");

    let client = SkyReelsClient::new(&api_key);

    // 示例 1: 查询任务状态并输出 JSON
    info!("=== 示例 1: 查询任务状态并输出 JSON ===");

    let task_id = "api-text2video-default-20260325-e53224dd-9fbd-46d9-b193-f1a6081a2486";

    match client.text2video().get_task(task_id).await {
        Ok(response) => {
            info!("任务状态: {}", response.get_status());

            // 输出格式化的 JSON
            match response.pretty_print() {
                Ok(json) => {
                    info!("完整响应 JSON:\n{}", json);
                }
                Err(e) => {
                    warn!("无法格式化 JSON: {}", e);
                }
            }

            // 根据状态处理
            match response.get_status() {
                TaskStatus::Success => {
                    if let Some(video_data) = response.get_video_data() {
                        info!("🎉 视频生成成功!");
                        info!("视频 URL: {}", video_data.video_url);
                        info!("时长: {} 秒", video_data.duration);
                        info!("分辨率: {}", video_data.resolution);

                        // 保存 JSON 到文件
                        if let Ok(json) = response.to_json() {
                            let filename = format!("task_{}_success.json", task_id);
                            tokio::fs::write(&filename, json).await?;
                            info!("✅ JSON 已保存到: {}", filename);
                        }
                    }
                }
                TaskStatus::Failed => {
                    warn!("❌ 任务失败: {}", response.msg);
                }
                TaskStatus::Running => {
                    info!("⏳ 任务正在处理中...");
                }
                _ => {
                    info!("📋 任务状态: {}", response.get_status());
                }
            }
        }
        Err(e) => {
            warn!("查询任务失败: {}", e);
        }
    }

    // 示例 2: 提交任务并输出响应
    info!("\n=== 示例 2: 提交新任务 ===");

    let request = client.text2video()
        .submit_request(
            "一只可爱的小猫在阳光下玩耍，高清摄影，温暖色调",
        )
        .duration(5)
        .sound(true)
        .build();

    // 注意：这只是一个示例，实际提交需要使用 submit 方法
    info!("请求已创建 (未提交)");
    info!("提示: 要实际提交任务，请使用 client.text2video().submit(request).await?");

    // 示例 3: 批量查询多个任务
    info!("\n=== 示例 3: 批量查询任务状态 ===");

    let task_ids = vec![
        "api-text2video-default-20260325-e53224dd-9fbd-46d9-b193-f1a6081a2486",
        // 添加更多任务 ID
    ];

    for (index, task_id) in task_ids.iter().enumerate() {
        info!("查询任务 {}/{}: {}", index + 1, task_ids.len(), task_id);

        match client.text2video().get_task(task_id).await {
            Ok(response) => {
                info!("状态: {}", response.get_status());

                // 如果需要，可以保存每个任务的 JSON
                if response.get_status() == TaskStatus::Success {
                    if let Ok(json) = response.to_json() {
                        let filename = format!("task_{}.json", index);
                        tokio::fs::write(&filename, json).await?;
                        info!("已保存到: {}", filename);
                    }
                }
            }
            Err(e) => {
                warn!("查询失败: {}", e);
            }
        }
    }

    info!("\n=== 完成 ===");
    info!("提示: 设置 RUST_LOG=debug 环境变量可以查看完整的 API 响应");

    Ok(())
}
