package com.qaup.system.mapper;

import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.qaup.system.domain.SysVehicleLocation;
import com.qaup.system.domain.vo.TrajectoryStatistics;

/**
 * 车辆运动信息Mapper接口
 * 
 * @author qaup
 * @date 2025-01-16
 */
public interface SysVehicleLocationMapper 
{
    /**
     * 查询车辆运动信息列表
     * 
     * @param sysVehicleLocation 车辆运动信息
     * @return 车辆运动信息集合
     */
    public List<SysVehicleLocation> selectSysVehicleLocationList(SysVehicleLocation sysVehicleLocation);

    /**
     * 根据车辆ID查询车辆运动信息
     * 
     * @param vehicleId 车辆ID
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectSysVehicleLocationByVehicleId(Long vehicleId);

    /**
     * 根据车牌号查询车辆运动信息
     * 
     * @param licensePlate 车牌号
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectSysVehicleLocationByLicensePlate(String licensePlate);

    /**
     * 查询车辆最新位置信息
     * 
     * @param vehicleId 车辆ID
     * @return 车辆运动信息
     */
    public SysVehicleLocation selectLatestSysVehicleLocationByVehicleId(Long vehicleId);

    /**
     * 根据车牌号查询车辆最新位置信息
     *
     * @param licensePlate 车牌号
     * @return 车辆运动信息
     */
    public SysVehicleLocation selectLatestSysVehicleLocationByLicensePlate(String licensePlate);

    /**
     * 查询车辆轨迹数据（支持采样优化）
     *
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param simplified 是否简化数据
     * @param maxPoints 最大轨迹点数量
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectVehicleTrajectory(@Param("vehicleId") Long vehicleId,
                                                           @Param("startTime") Date startTime,
                                                           @Param("endTime") Date endTime,
                                                           @Param("simplified") Boolean simplified,
                                                           @Param("maxPoints") Integer maxPoints);

    /**
     * 查询轨迹统计信息
     *
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 轨迹统计信息
     */
    public TrajectoryStatistics selectTrajectoryStatistics(@Param("vehicleId") Long vehicleId,
                                                          @Param("startTime") Date startTime,
                                                          @Param("endTime") Date endTime);

    /**
     * 查询轨迹回放数据
     *
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param intervalSeconds 时间间隔(秒)
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectTrajectoryPlaybackData(@Param("vehicleId") Long vehicleId,
                                                                @Param("startTime") Date startTime,
                                                                @Param("endTime") Date endTime,
                                                                @Param("intervalSeconds") Integer intervalSeconds);

    /**
     * 查询车辆在指定区域内的轨迹
     *
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param areaWkt 区域WKT格式字符串
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectVehicleTrajectoryInArea(@Param("vehicleId") Long vehicleId,
                                                                 @Param("startTime") Date startTime,
                                                                 @Param("endTime") Date endTime,
                                                                 @Param("areaWkt") String areaWkt);

    /**
     * 批量查询多车辆轨迹数据
     *
     * @param vehicleIds 车辆ID列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param simplified 是否简化数据
     * @param maxPoints 最大轨迹点数量
     * @return 车辆运动信息列表
     */
    public List<SysVehicleLocation> selectBatchVehicleTrajectory(@Param("vehicleIds") List<Long> vehicleIds,
                                                                @Param("startTime") Date startTime,
                                                                @Param("endTime") Date endTime,
                                                                @Param("simplified") Boolean simplified,
                                                                @Param("maxPoints") Integer maxPoints);
}