package com.qaup.collision.datacollector.repository;

import com.qaup.collision.datacollector.model.entity.VehicleCommandEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
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;

/**
 * 无人车控制指令仓库接口
 * 
 * 用于车辆控制指令的数据访问操作
 */
@Repository
public interface VehicleCommandRepository extends JpaRepository<VehicleCommandEntity, Long> {
    
    /**
     * 根据车辆ID查询控制指令
     * @param vehicleId 车辆ID
     * @return 指定车辆的控制指令列表
     */
    List<VehicleCommandEntity> findByVehicleId(Long vehicleId);
    
    /**
     * 根据车辆ID查询控制指令，按时间倒序排列
     * @param vehicleId 车辆ID
     * @return 指定车辆的控制指令列表（按时间倒序）
     */
    List<VehicleCommandEntity> findByVehicleIdOrderByTimestampDesc(Long vehicleId);
    
    /**
     * 根据车辆ID和时间范围查询控制指令
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 指定时间范围内的控制指令列表
     */
    List<VehicleCommandEntity> findByVehicleIdAndTimestampBetween(Long vehicleId, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据时间范围查询控制指令
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 指定时间范围内的控制指令列表
     */
    List<VehicleCommandEntity> findByTimestampBetween(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 根据车辆ID和指令类型查询控制指令
     * @param vehicleId 车辆ID
     * @param commandType 指令类型
     * @return 指定车辆和指令类型的控制指令列表
     */
    @Query("SELECT v FROM VehicleCommandEntity v WHERE v.vehicleId = :vehicleId AND v.commandType = :commandType")
    List<VehicleCommandEntity> findByVehicleIdAndCommandType(@Param("vehicleId") Long vehicleId, @Param("commandType") String commandType);
    
    /**
     * 查询指定车辆的最新控制指令
     * @param vehicleId 车辆ID
     * @return 最新的控制指令
     */
    VehicleCommandEntity findTopByVehicleIdOrderByTimestampDesc(Long vehicleId);
    
    /**
     * 删除指定时间之前的历史控制指令
     * @param beforeTime 时间点
     * @return 删除的记录数
     */
    @Modifying
    @Query("DELETE FROM VehicleCommandEntity v WHERE v.timestamp < :beforeTime")
    int deleteByTimestampBefore(@Param("beforeTime") LocalDateTime beforeTime);
} 