package cn.iocoder.yudao.module.system.service.attendance.fixed;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedRespVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.attendancespecial.AttendanceSpecialDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 固定班制考勤设置 Service 接口
 *
 * @author 艾楷
 */
public interface AttendanceFixedService {

    /**
     * 创建固定班制考勤设置
     *
     * @param vos        创建信息
     * @param specialDOS
     * @return 编号
     */
    Long batchCreateOrUpdate(Long attendanceGroupId, List<AttendanceFixedSaveReqVO> vos, List<AttendanceSpecialDO> specialDOS);

    /**
     * 更新固定班制考勤设置
     *
     * @param updateReqVO 更新信息
     */
    void updateFixed(@Valid AttendanceFixedSaveReqVO updateReqVO);

    /**
     * 删除固定班制考勤设置
     *
     * @param id 编号
     */
    void deleteFixed(Long id);

    /**
     * 获得固定班制考勤设置
     *
     * @param id 编号
     * @return 固定班制考勤设置
     */
    AttendanceFixedDO getFixed(Long id);

    /**
     * 获得固定班制考勤设置分页
     *
     * @param pageReqVO 分页查询
     * @return 固定班制考勤设置分页
     */
    PageResult<AttendanceFixedDO> getFixedPage(AttendanceFixedPageReqVO pageReqVO);

    /**
     * 通过考勤组id+周几 获取固定班制考勤设置
     *
     * @param attendanceGroupId
     * @param week
     * @return
     */
    AttendanceFixedDO getByGroupIdAndWeek(Long attendanceGroupId, Integer week);

    List<AttendanceFixedDO> getByGroupIdAndWeeks(Long attendanceGroupId, List<Integer> weeks);

    List<AttendanceFixedDO> getByGroupId(Long attendanceGroupId);

    List<AttendanceFixedDO> getByGroupIdAndWeek(List<Long> attendanceGroupIds, Integer week);

    /**
     * 获取考勤组和班次id的map
     *
     * @param fixedList
     * @param localDateTime
     * @return
     */
    Map<Long, Long> getGroupToShiftIdMap(List<AttendanceGroupDO> fixedList, LocalDateTime localDateTime);

    /**
     * 通过考勤组id获取列表
     *
     * @param attendanceGroupId
     * @return
     */
    List<AttendanceFixedRespVO> getListByGroupId(Long attendanceGroupId);

    /**
     * 查询使用的考勤组ids
     *
     * @param shiftId
     * @return
     */
    List<Long> getUseGroupIds(Long shiftId);
}
