package com.dora.service;

import com.dora.dto.CreateTaskDto;
import com.dora.dto.AiTaskWithPlazaDto;
import com.dora.entity.AiTask;
import com.dora.exception.InsufficientPointsException;

import java.util.List;

public interface AiTaskService {

    /**
     * 创建一个新的AI生成任务。
     *
     * @param createTaskDto 包含创建任务所需信息的DTO
     * @return 创建成功后的任务实体
     * @throws InsufficientPointsException 如果用户积分不足
     * @throws IllegalArgumentException 如果模型不存在或不可用
     */
    AiTask createTask(CreateTaskDto createTaskDto) throws InsufficientPointsException, IllegalArgumentException;

    /**
     * 更新任务状态。
     *
     * @param taskNo      任务编号
     * @param newStatus   新的状态
     * @param message     状态变更信息
     */
    void updateTaskStatus(String taskNo, String newStatus, String message);

    /**
     * 标记任务为成功。
     *
     * @param taskNo     任务编号
     * @param resultUrl  生成结果的URL
     */
    void markTaskAsSuccess(String taskNo, String resultUrl);

    /**
     * 标记任务为失败并退款。
     *
     * @param taskNo       任务编号
     * @param errorMessage 失败原因
     */
    void markTaskAsFailed(String taskNo, String errorMessage);

    /**
     * 根据任务编号获取任务详情。
     *
     * @param taskNo 任务编号
     * @param userId 用户ID (用于权限校验)
     * @return 任务实体，如果找不到或无权访问则返回null
     */
    AiTask getTaskByTaskNo(String taskNo, Long userId);

    /**
     * 获取指定用户的任务列表（分页）。
     *
     * @param userId 用户ID
     * @param status 状态筛选 (可选)
     * @return 任务实体列表
     */
    List<AiTask> getUserTasks(Long userId, String status);
    
    /**
     * 获取指定用户的任务列表（支持任务类型筛选）。
     *
     * @param userId 用户ID
     * @param status 状态筛选 (可选)
     * @param taskType 任务类型筛选 (可选：text_to_image, text_to_video, image_to_video等)
     * @return 任务实体列表
     */
    List<AiTask> getUserTasksWithType(Long userId, String status, String taskType);
    
    /**
     * 获取指定用户的任务列表并关联广场作品信息（分页）。
     *
     * @param userId 用户ID
     * @param status 状态筛选 (可选)
     * @return 任务与广场作品联合查询结果列表
     */
    List<AiTaskWithPlazaDto> getUserTasksWithPlaza(Long userId, String status);
    
    /**
     * 获取指定用户的任务列表并关联广场作品信息（支持任务类型筛选）。
     *
     * @param userId 用户ID
     * @param status 状态筛选 (可选)
     * @param taskType 任务类型筛选 (可选：text_to_image, text_to_video, image_to_video等)
     * @return 任务与广场作品联合查询结果列表
     */
    List<AiTaskWithPlazaDto> getUserTasksWithPlazaAndType(Long userId, String status, String taskType);

    /**
     * (管理员用) 获取所有任务列表（分页）。
     *
     * @param userId 用户ID筛选 (可选)
     * @param status 状态筛选 (可选)
     * @param modelName 模型名称筛选 (可选)
     * @param taskNo 任务编号筛选 (可选)
     * @return 任务实体列表
     */
    List<AiTask> getAllTasks(Long userId, String status, String modelName, String taskNo);

    /**
     * (管理员用) 强制取消一个任务。
     *
     * @param taskNo 要取消的任务编号
     * @return 操作是否成功
     */
    boolean cancelTask(String taskNo);

    /**
     * 处理一个已入队的AI任务。
     * 此方法会更新任务状态为处理中，并异步调用AI模型。
     *
     * @param taskNo 要处理的任务编号
     */
    void processTask(String taskNo);

    /**
     * (用户端) 删除用户的AI任务及相关广场作品。
     *
     * @param taskNo 任务编号
     * @param userId 用户ID (用于权限校验)
     * @return 操作是否成功
     */
    boolean deleteUserTask(String taskNo, Long userId);
}
