/**
 * 任务相关 API
 * 对接后端方案 A 扩展后的端点（PR #109）
 * - POST /api/v1/generation/tasks — 创建生成任务（template_id + asset_ids 细粒度模式）
 * - GET  /api/v1/tasks              — 用户级任务列表（跨 project）
 * - POST /api/v1/tasks/{task_id}/retry — 简化重试
 */
import apiClient from "./client";

/* ──────────── 类型定义 ──────────── */

/** 任务条目（对应用户级 UserTaskResponse） */
export interface TaskItem {
  id: string;
  task_type: "ingest" | "generation" | string;
  project_id: string;
  template_id: string;
  status: string;
  progress: number;
  current_step: string;
  error_message: string;
  user_message: string;
  retryable: boolean;
  source_id: string;
  created_at?: string | null;
  updated_at?: string | null;
}

/** 创建生成任务请求参数 */
export interface CreateGenerationTaskRequest {
  template_id: string;
  asset_ids: string[];
  title_ids: string[];
  voice_ids: string[];
}

/** 创建生成任务响应（对齐后端 GenerationTaskResponse） */
export interface CreateGenerationTaskResponse {
  id: string;
  project_id: string;
  asset_library_id: string;
  strategy_id: string;
  voice_library_id: string;
  template_id: string;
  asset_ids: string[];
  title_ids: string[];
  voice_ids: string[];
  status: string;
  progress: number;
  result_count: number;
  error_message: string;
}

/* ──────────── API 函数 ──────────── */

/** 创建生成任务（一键生成） */
export const createGenerationTask = async (
  params: CreateGenerationTaskRequest,
): Promise<CreateGenerationTaskResponse> => {
  const { data } = await apiClient.post<CreateGenerationTaskResponse>(
    "/generation/tasks",
    params,
  );
  return data;
};

/** 获取当前用户的所有任务（跨 project） */
export const getUserTasks = async (): Promise<TaskItem[]> => {
  const { data } = await apiClient.get("/tasks");
  return data.items || [];
};

/** 获取单个任务详情（用于轮询进度） */
export const getTask = async (taskId: string): Promise<TaskItem> => {
  const { data } = await apiClient.get(`/tasks/${taskId}`);
  return data;
};

/** 重试失败的任务 */
export const retryTask = async (taskId: string): Promise<TaskItem> => {
  const { data } = await apiClient.post(`/tasks/${taskId}/retry`);
  return data;
};
