package com.dora.mapper;

import com.dora.entity.AiTask;
import com.dora.dto.AiTaskWithPlazaDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface AiTaskMapper {
    int insert(AiTask task);
    AiTask findByTaskNo(String taskNo);
    int update(AiTask task);
    List<AiTask> findStuckTasks(@Param("timeoutThreshold") LocalDateTime timeoutThreshold);
    
    /**
     * 查询用户任务（支持状态筛选）
     */
    List<AiTask> findUserTasks(@Param("userId") Long userId, @Param("status") String status);
    
    /**
     * 查询用户任务（支持状态和任务类型筛选）
     */
    List<AiTask> findUserTasksWithType(
            @Param("userId") Long userId, 
            @Param("status") String status,
            @Param("taskType") String taskType);
    
    List<AiTask> findAllAdmin(@Param("userId") Long userId, @Param("status") String status, @Param("modelName") String modelName, @Param("taskNo") String taskNo);
    
    /**
     * 查询指定provider的processing任务（用于轮询）
     */
    List<AiTask> findProcessingTasksByProvider(@Param("providerType") String providerType);
    
    /**
     * 查询用户任务并关联广场作品信息（支持状态筛选）
     */
    List<AiTaskWithPlazaDto> findUserTasksWithPlaza(@Param("userId") Long userId, @Param("status") String status);
    
    /**
     * 查询用户任务并关联广场作品信息（支持状态和任务类型筛选）
     */
    List<AiTaskWithPlazaDto> findUserTasksWithPlazaAndType(
            @Param("userId") Long userId, 
            @Param("status") String status,
            @Param("taskType") String taskType);
    
    /**
     * 通过任务编号查询任务详情（包含作者信息）
     */
    java.util.Map<String, Object> findTaskDetailByTaskNo(@Param("taskNo") String taskNo);
    
    /**
     * 逻辑删除用户的AI任务
     */
    int deleteByTaskNoAndUserId(@Param("taskNo") String taskNo, @Param("userId") Long userId);
    
    /**
     * 查询队列中超时的任务
     * @param timeoutThreshold 超时时间阈值（早于此时间的任务被视为超时）
     * @return 超时的队列任务列表
     */
    List<AiTask> findQueuedTasksBeforeTime(@Param("timeoutThreshold") LocalDateTime timeoutThreshold);
}
