package com.example.demo.repository;

import com.example.demo.model.TaskStatus;
import com.example.demo.model.enums.CommonTaskType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

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

@Repository
public interface TaskStatusRepository extends JpaRepository<TaskStatus, Long> {
    
    /**
     * 根据任务ID查找状态
     */
    Optional<TaskStatus> findByTaskId(String taskId);
    
    /**
     * 根据任务ID查找状态（取第一条，处理重复记录情况）
     */
    Optional<TaskStatus> findFirstByTaskIdOrderByIdDesc(String taskId);
    
    /**
     * 根据用户名查找所有任务状态
     */
    List<TaskStatus> findByUsernameOrderByCreatedAtDesc(String username);
    
    /**
     * 根据用户名和状态查找任务
     */
    List<TaskStatus> findByUsernameAndStatus(String username, TaskStatus.Status status);
    
    /**
     * 查找需要轮询的任务（处理中且未超时）
     */
    @Query("SELECT t FROM TaskStatus t WHERE t.status = 'PROCESSING' AND t.pollCount < t.maxPolls AND (t.lastPolledAt IS NULL OR t.lastPolledAt < :cutoffTime)")
    List<TaskStatus> findTasksNeedingPolling(@Param("cutoffTime") LocalDateTime cutoffTime);

    /**
     * 计数：查找需要轮询的任务数量（用于快速短路判断，避免加载实体列表）
     */
    @Query("SELECT COUNT(t) FROM TaskStatus t WHERE t.status = 'PROCESSING' AND t.pollCount < t.maxPolls AND (t.lastPolledAt IS NULL OR t.lastPolledAt < :cutoffTime)")
    long countTasksNeedingPolling(@Param("cutoffTime") LocalDateTime cutoffTime);
    
    /**
     * 查找超时的任务
     */
    @Query("SELECT t FROM TaskStatus t WHERE t.status = 'PROCESSING' AND t.pollCount >= t.maxPolls")
    List<TaskStatus> findTimeoutTasks();
    
    /**
     * 根据外部任务ID查找状态
     */
    Optional<TaskStatus> findByExternalTaskId(String externalTaskId);
    
    /**
     * 统计用户的任务数量
     */
    long countByUsername(String username);

    /**
     * 根据状态统计任务数量（用于快速短路判断）
     */
    long countByStatus(TaskStatus.Status status);
    
    /**
     * 根据状态查找所有任务（不分页）
     */
    List<TaskStatus> findAllByStatus(TaskStatus.Status status);
    
    /**
     * 统计用户指定状态的任务数量
     */
    long countByUsernameAndStatus(String username, TaskStatus.Status status);
    
    /**
     * 查找最近创建的任务
     */
    @Query("SELECT t FROM TaskStatus t WHERE t.username = :username ORDER BY t.createdAt DESC")
    List<TaskStatus> findRecentTasksByUsername(@Param("username") String username, org.springframework.data.domain.Pageable pageable);

    /**
     * 查找所有任务（管理员功能，支持分页）
     */
    @Query("SELECT t FROM TaskStatus t ORDER BY t.createdAt DESC")
    org.springframework.data.domain.Page<TaskStatus> findAllWithPagination(org.springframework.data.domain.Pageable pageable);

    /**
     * 根据状态查找任务（管理员功能，支持分页）
     */
    org.springframework.data.domain.Page<TaskStatus> findByStatus(TaskStatus.Status status, org.springframework.data.domain.Pageable pageable);

    /**
     * 根据任务类型查找任务（管理员功能，支持分页）
     */
    org.springframework.data.domain.Page<TaskStatus> findByTaskType(CommonTaskType taskType, org.springframework.data.domain.Pageable pageable);
}


















