package jnpf.attendance.mapper;

import jnpf.base.mapper.SuperMapper;
import jnpf.entity.attendance.FtbAttendanceDailyRule;
import jnpf.model.attendance.vo.*;
import jnpf.model.attendance.vo.attendance.YesterdayRuleVo;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 考勤组-每日出勤规则 Mapper 接口
 * </p>
 *
 * @author ahua
 * @since 2023-11-22
 */
public interface AttendanceDailyRuleMapper extends SuperMapper<FtbAttendanceDailyRule> {

    /**
     * 查询昨天和今天的出勤规则
     * @param currentDate 当前日期
     * @param userId 用户id
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getRuleClockTimeContainsToday(@Param("currentDate") Date currentDate, @Param("userId") String userId);

    /**
     * 查询指定日期的最后一个出勤规则
     * @param currentDate 当前日期
     * @param userId 用户id
     * @return jnpf.entity.attendance.FtbAttendanceDailyRule
     */
    FtbAttendanceDailyRule getLastDailyRule(@Param("currentDate") Date currentDate, @Param("userId") String userId);

    /**
     * 查询ruleId的上一个或下一个(班/加班)出勤
     * @param ruleId 出勤id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param userId 用户id
     * @param queryType 查询类型(previous/next)
     * @return jnpf.entity.attendance.FtbAttendanceDailyRule
     */
    FtbAttendanceDailyRule getPreviousOrNextRule(@Param("ruleId") String ruleId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userId") String userId, @Param("queryType") String queryType);

    /**
     * 获取指定日期的排班
     * @param startDay 指定日期 2023-11-11
     * @return java.util.List<jnpf.model.attendance.vo.ClassesDetailVo>
     * @author hlp
     */
    List<ClassesDetailVo> getShiftByDay(@Param("startDay") String startDay, @Param("userId") String userId);

    /**
     * 查询所有下班缺卡时间是今天的出勤规则(普班)
     * @param today 今天
     * @param yesterday 昨天
     * @param userId 用户id
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getRuleListByDate(@Param("today") Date today, @Param("yesterday") Date yesterday, @Param("userId") String userId);

    /**
     * 查询指定日期最后一个班次是加班的出勤记录
     * @param date 日期
     * @param userId 用户id
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getOverTimeRuleListByDate(@Param("date") Date date, @Param("userId") String userId);

    /**
     * 获取用户时间段内排班信息
     * @param userId 用户id
     * @param startTime 开始时间
     * @param endTime  结束时间
     * @return java.lang.Integer
     * @author hlp
     */
    Integer getUserShift(@Param("userId") String userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询所有工作时间是queryDate的出勤规则
     * @param queryDate 日期
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getListWorkTimeInToday(@Param("queryDate") Date queryDate);

    /**
     * 查询上班/下班时间在时间范围内的出勤规则
     * @param beginDate 开始时间
     * @param endDate 结束时间
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getListByWorkTime(@Param("beginDate") Date beginDate, @Param("endDate") Date endDate);

    /**
     * 查询一个月的打卡记录(缺勤次数统计)
     * @return java.util.List<jnpf.model.attendance.vo.MonthRecordVo>
     */
    List<MonthRecordVo> selectMonthRecord();

    /**
     * 查询存在的出勤规则
     * @param ruleIdList 出勤规则id列表
     * @return java.util.List<java.lang.String>
     */
    List<String> getExistRuleId(@Param("list") List<String> ruleIdList);

    /**
     * 获取排班用户数
     * @param userIds 用户Ids
     * @param groupIds 考勤组Ids
     * @return int
     */
    Integer getGroupUserNum(@Param("userIds") List<String> userIds, @Param("groupIds") List<String> groupIds);
    /**
     * 查询今日班次
     * @param userId 用户Id
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return java.util.List<YesterdayRuleVo>
     */
    List<YesterdayRuleVo> getYesterdayRule(@Param("userId") String userId,@Param("startDate") Date startDate,@Param("endDate") Date endDate);
    /**
     * 获取排班用户数
     * @param groupUserIds 用户Ids
     * @param groupIds 考勤组Ids
     * @return java.util.List<java.lang.String>
     */
    List<String> getDayRule(@Param("groupUserIds") List<String> groupUserIds, @Param("groupIds") List<String> groupIds);

    /**
     * 批量查询[当日+前一日]出勤规则
     * @param userDayList 用户日期列表
     * @return java.util.List<jnpf.entity.attendance.FtbAttendanceDailyRule>
     */
    List<FtbAttendanceDailyRule> getDailyRuleListBatch(@Param("list") List<UserDayVo> userDayList);

    /**
     * 获取用户已使用的公休数
     * @param yearMonth 年月 格式yyyy-MM
     * @param userIds 用户Ids
     * @return java.util.Map<java.lang.String, java.math.BigDecimal>
     */
    List<KeyValueVo> getUserPublicHoliday(@Param("yearMonth") String yearMonth, @Param("userIds") List<String> userIds);

    /**
     * 查询每个出勤规则的下一个出勤规则
     * @param dayRuleIds 出勤规则ids
     * @param dayStr 日期
     * @return java.util.List<jnpf.model.attendance.vo.NextRuleVo>
     */
    List<NextRuleVo> getNextRulePartInfo(@Param("list") List<String> dayRuleIds, @Param("dayStr") String dayStr);

    /**
     * 获取指定日期的出勤规则
     * @param finalStartDate 开始日期
     * @param finalEndDate   结束日期
     * @return 排班列表
     */
    List<CreateDayStatistics> getDayRuleByMonth(@Param("startDate") LocalDate finalStartDate, @Param("endDate") LocalDate finalEndDate);
}
