package jnpf.attendance.service;

import jnpf.model.attendance.model.*;
import jnpf.model.attendance.vo.attendance.DayStatisticsQueryVo;
import jnpf.model.common.DateRangeDto;
import jnpf.permission.vo.v2.user.UserBoundVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 统计公共方法服务
 *
 * @author shitou
 * @date 2023/11/22
 */
public interface StatisticsUtilService {
    /**
     * 获取用户考勤情况
     *
     * @param userId                   用户ID
     * @param selectDateRangeDto       日期范围
     * @param dateArrayList            月日期集合
     * @param dayStatisticsQueryVoList 用户日统计数据
     * @return List<ClockInfo>
     */
    List<ClockInfo> getUserClockDateArrayList(String userId, DateRangeDto selectDateRangeDto,
                                              List<Date> dateArrayList, List<DayStatisticsQueryVo> dayStatisticsQueryVoList);

    /**
     * 获取请假记录
     *
     * @param userMap      用户信息
     * @param ratioMap     出勤换算比
     * @param userIds      用户集合
     * @param dateRangeDto 日期范围
     * @return 请假记录 Key是用户ID+考勤组ID
     */
    Map<String, List<LeaveRecord>> getLeaveMap(Map<String, UserBoundVO> userMap, Map<String, BigDecimal> ratioMap, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取迟到记录集合
     *
     * @param userMap      用户信息
     * @param sealMap      用户是否封账
     * @param groupIds     考勤组集合
     * @param userIds      用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 迟到记录 Key是用户ID+考勤组ID
     */
    Map<String, List<LateRecord>> getLateMap(Map<String, UserBoundVO> userMap, Map<String, Boolean> sealMap, List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取早退记录集合
     *
     * @param userMap      用户信息
     * @param sealMap      用户是否封账
     * @param groupIds     考勤组集合
     * @param userIds      用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 早退记录 Key是用户ID+考勤组ID
     */
    Map<String, List<EarlyLeaveRecord>> getEarlyMap(Map<String, UserBoundVO> userMap, Map<String, Boolean> sealMap, List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取缺卡记录集合
     *
     * @param userMap      用户信息
     * @param sealMap      用户是否封账
     * @param groupIds     考勤组集合
     * @param userIds      用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 缺卡记录 Key是用户ID+考勤组ID
     */
    Map<String, List<AbsenceCardRecord>> getAbsenceCardMap(Map<String, UserBoundVO> userMap, Map<String, Boolean> sealMap, List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取缺勤记录集合
     *
     * @param groupIds     考勤组集合
     * @param sealMap      用户是否封账
     * @param userIds      用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 缺勤记录 Key是用户ID+考勤组ID
     */
    Map<String, List<AbsenceRecord>> getAbsenceMap(List<String> groupIds, Map<String, Boolean> sealMap, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取补卡记录集合
     *
     * @param groupIds     考勤组集合
     * @param userIds      用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 补卡记录 Key是用户ID+考勤组ID
     */
    Map<String, List<MakeUpCardRecord>> getMakeUpCardMap(List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取外勤记录集合
     *
     * @param groupIds 考勤组集合
     * @param userIds  用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 外勤记录 Key是用户ID+考勤组ID
     */
    Map<String, List<OutworkRecord>> getOutworkRecordList(List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取加班记录集合
     *
     * @param groupIds 考勤组集合
     * @param userIds  用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 加班记录 Key是用户ID+考勤组ID
     */
    Map<String, List<OvertimeRecord>> getOvertimeRecordList(List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取借调记录集合
     *
     * @param groupIds 考勤组集合
     * @param userIds  用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 借调记录 Key是用户ID+考勤组ID
     */
    Map<String, List<SecondRecord>> getSecondRecordList(List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取出差记录集合
     *
     * @param groupIds 考勤组集合
     * @param userIds  用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 出差记录 Key是用户ID+考勤组ID
     */
    Map<String, List<BusOrOutRecord>> getBusRecordList(List<String> groupIds, List<String> userIds, DateRangeDto dateRangeDto);

    /**
     * 获取外出记录集合
     *
     * @param ratioMap 考勤组集合
     * @param userIds  用户集合
     * @param dateRangeDto 筛选时间范围
     * @return 外出记录 Key是用户ID+考勤组ID
     */
    Map<String, List<BusOrOutRecord>> getOutRecordList(Map<String, BigDecimal> ratioMap, List<String> userIds, DateRangeDto dateRangeDto);
}
