package com.gameplatform.server.mapper.cooldown;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gameplatform.server.model.entity.cooldown.MachineCooldown;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * 设备冷却状态Mapper
 */
@Mapper
public interface MachineCooldownMapper extends BaseMapper<MachineCooldown> {
    
    /**
     * 根据设备ID查找活跃的冷却记录
     */
    MachineCooldown findActiveCooldownByMachineId(@Param("machineId") String machineId);
    
    /**
     * 根据设备ID和状态查找冷却记录
     */
    List<MachineCooldown> findByMachineIdAndStatus(@Param("machineId") String machineId, 
                                                   @Param("status") String status);
    
    /**
     * 查找已过期但状态仍为ACTIVE的冷却记录
     */
    List<MachineCooldown> findExpiredActiveCooldowns(@Param("currentTime") LocalDateTime currentTime,
                                                     @Param("limit") int limit);
    
    /**
     * 批量更新过期的冷却记录状态
     */
    int batchUpdateExpiredCooldowns(@Param("currentTime") LocalDateTime currentTime);
    
    /**
     * 手动移除设备的冷却状态
     */
    int removeMachineCooldown(@Param("machineId") String machineId);
    
    /**
     * 根据链接任务ID查找冷却记录
     */
    List<MachineCooldown> findByLinkTaskId(@Param("linkTaskId") Long linkTaskId);
    
    /**
     * 统计活跃的冷却记录数量
     */
    long countActiveCooldowns();
    
    /**
     * 统计指定时间范围内的冷却记录数量
     */
    long countCooldownsByTimeRange(@Param("startTime") LocalDateTime startTime,
                                   @Param("endTime") LocalDateTime endTime);
    
    /**
     * 清理指定时间之前的已过期冷却记录
     */
    int cleanupExpiredCooldowns(@Param("beforeTime") LocalDateTime beforeTime);

    /**
     * 删除将要过期（ACTIVE→EXPIRED）的设备，已存在的 EXPIRED 记录，避免唯一键 (machine_id,status) 冲突。
     * 使用当前时间参数筛选出需要过期的设备列表。
     */
    int deleteExistingExpiredForMachinesToExpire(@Param("currentTime") LocalDateTime currentTime);
    
    /**
     * 获取指定设备的冷却历史记录
     */
    List<MachineCooldown> getCooldownHistory(@Param("machineId") String machineId,
                                           @Param("limit") int limit,
                                           @Param("offset") int offset);
}

