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

import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.*;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.addressgroup.AttendanceAddressGroupItemDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 考勤 Service 接口
 *
 * @author 艾楷
 */
public interface AttendanceService {

    /**
     * 获取打卡页面
     *
     * @param attendancePunchPageDTO
     * @return
     */
    AttendancePunchPageVO getPunchPage(AttendancePunchPageDTO attendancePunchPageDTO);

    /**
     * 判断当前传如时间是否是 节假日(节假日分 补班/放假) 补班的话返回false 放假的话返回 true
     * 如果不是节假日的话返回null
     *
     * @param localDateTime
     * @return
     */
    Boolean isHoliday(LocalDateTime localDateTime);

    /**
     * 计算考勤信息
     *
     * @param vo
     * @param dto
     */
    void calculatePunch(AttendancePunchPageDTO dto, AttendancePunchPageVO vo);

    /**
     * 打卡
     *
     * @param attendancePunchDTO
     * @return
     */
    AttendancePunchVO punch(AttendancePunchDTO attendancePunchDTO);

    /**
     * 校验考勤地址
     *
     * @param latitude
     * @param longitude
     * @param addressList
     * @param addressGroupIds
     * @return
     */
    Integer verifyCheckInAddress(double latitude, double longitude, List<AttendanceAddressGroupItemDO> addressList, String addressGroupIds);

    List<AttendanceOnTheDayDTO> buildAttendanceOnTheDay(List<AttendanceGroupShiftItemDO> attendanceGroupShiftItemDOList);

    /**
     * 按天查询
     *
     * @param dto
     * @return
     */
    Map<String, AttendanceStatusByDayVO> statisticsByDay(AttendanceStatisticsByDayDTO dto);

    /**
     * 考勤统计按周期
     *
     * @param dto
     * @return
     */
    AttendanceStatisticsVO statisticsByCycle(AttendanceStatisticsByCycleDTO dto);

    /**
     * 团队统计按天查询
     *
     * @param dto
     * @return
     */
    Map<String, TeamAttendanceStatisticsByDayVO> teamStatisticsByDay(TeamAttendanceStatisticsByDayDTO dto);

    /**
     * 团队按周期查询
     *
     * @param dto
     * @return
     */
    TeamAttendanceStatisticsByCycleVO tesmStatisticsByCycle(TeamAttendanceStatisticsByCycleDTO dto);

    /**
     * 获取当前登录用户所属的考勤组以及是否具有管理员权限
     *
     * @return
     */
    List<AttendanceGroupSystemVO> getTheAttendanceGroupToWhichTheCurrentlyLoggedInUserBelongsAndWhetherTheyHaveAdministratorRights(Boolean allFlag);

    /**
     * 获取考勤规则
     *
     * @param groupId
     * @return
     */
    AttendanceRulesVO getRules(Long groupId);

    /**
     * 导出考勤报表
     *
     * @param response
     * @param dto
     */
    void exportAttendanceExcel(HttpServletResponse response, ExportAttendanceExcelDTO dto);

    /**
     * 根据用户获取考勤组规则
     *
     * @return
     */
    AttendanceRulesVO getRulesByUserId();

    /**
     * 获取本月补卡次数
     *
     * @return
     */
    Integer getReplacementCardNum();

    /**
     * 使用补卡次数
     *
     * @param userId
     */
    void useReplacementCardNum(Long userId);

    /**
     * 使用补卡次数
     */
    void useReplacementCardNum();

    /**
     * 补卡
     *
     * @param dto
     */
    void replacementCard(AttendanceReplacementCardDTO dto);

    /**
     * 考勤机打卡
     *
     * @param object
     * @return
     */
    JSONObject attendanceMachineCheck(JSONObject object);
}
