/**
 * 视频上传 IPC 模块
 * =================
 *
 * 上传本地视频到后端，由后端转存至七牛云。
 */

import { invoke } from '@tauri-apps/api/core';

interface ComposeVideoResult {
  outputPath: string;
  duration: number;
}

interface UploadVideoResult {
  url: string;
}

interface UploadAudioResult {
  url: string;
}

interface ApiResponse<T> {
  code: number;
  message: string;
  data?: T;
}

/**
 * 上传本地视频到后端（后端上传到七牛云）
 *
 * @param localPath 本地视频文件路径
 * @returns 七牛云 URL
 */
export async function uploadVideoFile(localPath: string): Promise<string> {
  const res = await invoke<ApiResponse<UploadVideoResult>>('upload_video_file', {
    localPath,
  });
  if (res.code !== 200 || !res.data?.url) {
    throw new Error(res.message || '上传视频失败');
  }
  return res.data.url;
}

/**
 * 上传本地音频文件到后端（后端上传到七牛云）
 *
 * @param localPath 本地音频文件路径
 * @returns 七牛云 URL
 */
export async function uploadAudioFile(localPath: string): Promise<string> {
  const res = await invoke<ApiResponse<UploadAudioResult>>('upload_audio_file', {
    localPath,
  });
  if (res.code !== 200 || !res.data?.url) {
    throw new Error(res.message || '上传音频失败');
  }
  return res.data.url;
}

/**
 * 生成空镜片段（原子操作：截取视频 → 截取音频 → 替换音频 → 清理临时文件）
 *
 * @param args 生成参数
 * @returns 生成的片段本地路径
 */
export async function generateEmptyShotClip(args: {
  videoSource: string;
  audioSource: string;
  audioStart: number;
  duration: number;
  outputPath: string;
}): Promise<string> {
  const res = await invoke<ApiResponse<string>>('generate_empty_shot_clip', { args });
  // eslint-disable-next-line eqeqeq
  if (res.code !== 200 || res.data == null) {
    throw new Error(res.message || '生成空镜片段失败');
  }
  return res.data;
}

/**
 * 直接拼接已标准化的视频片段（不做裁剪）
 *
 * @param projectId 项目 ID
 * @param clipPaths 片段文件路径列表（编码必须一致）
 * @returns 合成后的本地视频路径
 */
export async function concatVideoClips(
  projectId: string,
  clipPaths: string[]
): Promise<ComposeVideoResult> {
  const res = await invoke<ApiResponse<ComposeVideoResult>>('concat_video_clips', {
    projectId,
    clipPaths,
  });
  // eslint-disable-next-line eqeqeq
  if (res.code !== 200 || res.data == null) {
    throw new Error(res.message || '视频拼接失败');
  }
  return res.data;
}

/**
 * 从 URL 下载文件到本地
 *
 * @param url 文件 URL
 * @param outputPath 本地保存路径
 * @returns 本地文件路径
 */
export async function downloadFile(url: string, outputPath: string): Promise<string> {
  const res = await invoke<ApiResponse<string>>('download_file', { url, outputPath });
  // eslint-disable-next-line eqeqeq
  if (res.code !== 200 || res.data == null) {
    throw new Error(res.message || '下载文件失败');
  }
  return res.data;
}
