package cn.iocoder.yudao.module.train.service;

import cn.iocoder.yudao.module.course.vo.CommissionExportVO;
import cn.iocoder.yudao.module.train.entity.Train;
import cn.iocoder.yudao.module.train.vo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 预约练车 Service  接口
 *
 * @author lzt
 */
public interface TrainService extends IService<Train> {

    /**
     * 分页查询
     *
     * @param pageReqVO TODO
     * @param page      TODO
     * @author vinjor-M
     * @date 15:05 2025/1/14
     **/
    IPage<TrainVO> queryListPage(TrainVO pageReqVO, Page<TrainVO> page);

    /**
     * 分页查询训练记录
     *
     * @param pageReqVO TODO
     * @param page      TODO
     * @author vinjor-M
     * @date 15:05 2025/1/14
     **/
    IPage<TrainVO> queryTrainListPage(TrainVO pageReqVO, Page<TrainVO> page);

    /**
     * 到场打卡
     *
     * @param trainVO TODO
     * @author vinjor-M
     * @date 15:47 2025/1/14
     **/
    void createObj(TrainVO trainVO);

    /**
     * 离场打卡
     *
     * @param trainVO TODO
     * @author vinjor-M
     * @date 15:49 2025/1/14
     **/
    void updateObj(TrainVO trainVO);

    /**
     * 查某个学院某个课程某个科目某天的培训记录-未签退的
     *
     * @param userId   学员用户id
     * @param courseId 课程ID
     * @param subject  科目
     * @param dayStr   日期
     * @return cn.iocoder.yudao.module.train.entity.Train
     * @author vinjor-M
     * @date 10:21 2025/1/17
     **/
    Train getUserTrainData(Long userId, String courseId, Integer subject, String dayStr);

    /**
     * 查某学生所有培训记录
     *
     * @param userId  学生id
     * @param coachId 教练id，可能为空
     * @return java.util.List<cn.iocoder.yudao.module.train.entity.Train>
     * @author vinjor-M
     * @date 16:26 2025/2/10
     **/
    List<Train> selectByUserIdAndCoachId(Long userId, Long coachId);

    /**
     * 批量查询
     *
     * @param trainIds 训练id集合
     * @return
     */
    List<TrainVO> listJoinBatchByIds(List<String> trainIds);

    /**
     * 提醒教练未打卡学员信息
     */
    void noClockInRemind();

    NoClockInRemindVO noClockInRemindByUserId(Long userId, String carNo);

    /**
     * 根据教练打卡id，获取对应学员列表信息
     */
    List<Train> getTrainStudentList(String coachClockId);
    List<Train> getTrainErrorStudentList(String coachClockId);

    /**
     * 获取学员导出数据列表
     */
    IPage<TrainExportVO> getExportList(TrainExportVO exportVO, Page<TrainExportVO> page);

    /**
     * 三种导出
     */
    List<TrainExportVO> getTrainList(TrainExportVO exportVO);
    List<TrainExportVO> getAllTrainList(TrainExportVO exportVO);
    List<TrainExportVO> getTrainListByRange(TrainExportVO exportVO);


    /**
     * 当日正在训练学员统计
     */
    CloakAndTrainCountVO getTodayTrainSituation(TodayTrainVO train);

    /**
     * 获取当前正在训练的学员信息列表
     */
    IPage<TodayTrainVO> getTodayStudentTrainSituation(TodayTrainVO train, Page<TodayTrainVO> page);
}
