/**
 * 视频合成模块 - 后端 FFmpeg 方案
 */

// 后端 API 地址
const API_BASE = '/api/video';

/**
 * 合成视频 - 调用后端 API
 * @param {Array} slides 讲解点数组，每个包含 imageUrl 和 audioUrl
 * @param {Object} options 配置选项
 * @param {Function} onProgress 进度回调 { stage, current, total, message }
 * @returns {Promise<Blob>} 视频Blob
 */
export async function composeVideo(slides, options = {}, onProgress = null) {
  const {
    width = 1920,
    height = 1080,
  } = options;

  // 过滤有效的 slide，并使用原始完整 URL
  const validSlides = slides
    .filter(s => (s.originalImageUrl || s.imageUrl) && (s.originalAudioUrl || s.audioUrl))
    .map(s => ({
      // 优先使用原始完整 URL，否则使用当前 URL
      imageUrl: s.originalImageUrl || s.imageUrl,
      audioUrl: s.originalAudioUrl || s.audioUrl,
    }));
  
  if (validSlides.length === 0) {
    throw new Error('没有有效的讲解内容');
  }

  // 检查 URL 格式
  const invalidUrls = validSlides.filter(s => 
    !s.imageUrl.startsWith('http') && !s.imageUrl.startsWith('data:')
  );
  if (invalidUrls.length > 0) {
    console.warn('部分 URL 格式不正确:', invalidUrls);
  }

  // 阶段1: 准备请求
  if (onProgress) {
    onProgress({
      stage: 'preparing',
      current: 0,
      total: validSlides.length,
      message: '正在准备视频合成请求...',
    });
  }

  try {
    // 阶段2: 发送请求到后端
    if (onProgress) {
      onProgress({
        stage: 'composing',
        current: 1,
        total: validSlides.length,
        message: `服务器正在合成视频 (${validSlides.length} 个片段)...`,
      });
    }

    const response = await fetch(`${API_BASE}/compose`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        slides: validSlides,
        width,
        height,
      }),
    });

    if (!response.ok) {
      const error = await response.json().catch(() => ({ message: '请求失败' }));
      throw new Error(error.message || `服务器错误: ${response.status}`);
    }

    // 阶段3: 接收视频
    if (onProgress) {
      onProgress({
        stage: 'merging',
        current: validSlides.length,
        total: validSlides.length,
        message: '正在接收合成后的视频...',
      });
    }

    const videoBlob = await response.blob();

    if (onProgress) {
      onProgress({
        stage: 'completed',
        current: 1,
        total: 1,
        message: '视频合成完成！',
      });
    }

    return videoBlob;
  } catch (error) {
    console.error('视频合成失败:', error);
    throw new Error(`视频合成失败: ${error.message}`);
  }
}

/**
 * 下载视频
 * @param {Blob} blob 视频Blob
 * @param {string} filename 文件名
 */
export function downloadVideo(blob, filename = 'question-explanation.mp4') {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = filename;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url);
}

/**
 * 创建预览URL
 * @param {Blob} blob 视频Blob
 * @returns {string} Blob URL
 */
export function createPreviewUrl(blob) {
  return URL.createObjectURL(blob);
}

/**
 * 释放预览URL
 * @param {string} url Blob URL
 */
export function revokePreviewUrl(url) {
  URL.revokeObjectURL(url);
}
