package jnpf.attendance.service;

import cn.hutool.json.JSONArray;
import jnpf.base.UserInfo;
import jnpf.base.service.SuperService;
import jnpf.entity.AttendanceGroup;
import jnpf.entity.attendance.AttendanceBaseSetting;
import jnpf.exception.HandleException;
import jnpf.exception.QueryException;
import jnpf.model.attendance.dto.AttendanceBaseSettingDto;
import jnpf.model.attendance.vo.AttendanceBaseSettingVo;
import jnpf.model.attendance.vo.attendance.QuickCheckInVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 考勤基础设置表 服务类
 * </p>
 *
 * @author ahua
 * @since 2023-11-29
 */
public interface AttendanceBaseSettingService extends SuperService<AttendanceBaseSetting> {

    /**
     * 保存考勤基础设置信息。
     *
     * @param attendanceBaseSettingDto 考勤基础设置数据传输对象
     * @throws HandleException            处理异常
     */
    void save(AttendanceBaseSettingDto attendanceBaseSettingDto) throws HandleException;

    void hisBaseSetting(Map<String, String> group2orgMap, Map<String, String> org2groupMap);

    /**
     * 根据考勤组ID获取单个考勤基础设置。
     *
     * @param groupId 考勤组ID
     * @return 考勤基础设置视图对象
     */
    AttendanceBaseSettingVo getOne(String groupId);

    /**
     * 更改考勤基础设置的启用状态。
     *
     * @param groupId 考勤组ID
     * @param enable  启用状态（0禁用，1启用）
     * @param attendanceBaseSetting      考勤基础设置视图对象
     */
    void changeStatus(String groupId, Integer enable, AttendanceBaseSettingVo attendanceBaseSetting);

    /**
     * 获取启用的考勤基础设置信息。
     *
     * @param groupIds 考勤组ID列表
     * @return 启用的考勤基础设置映射
     */
    Map<String, AttendanceBaseSetting> getEnableBaseSetting(List<String> groupIds);

    /**
     * 获取所有启用的考勤基础设置信息。
     *
     * @param groupIds 考勤组ID列表
     * @return 所有启用的考勤基础设置映射
     */
    Map<String, AttendanceBaseSetting> getEnableBaseSettingAll(List<String> groupIds);

    /**
     * 获取指定考勤组和考勤组视图列表的启用的考勤基础设置信息。
     *
     * @param groupIds 考勤组ID列表
     * @param attendanceGroupVos      考勤组视图对象列表
     * @return 启用的考勤基础设置映射
     */
    Map<String, AttendanceBaseSetting> getEnableBaseSetting(List<String> groupIds, List<AttendanceGroup> attendanceGroupVos);

    /**
     * 初始化考勤基础设置。
     *
     * @param groupId 考勤组ID
     */
    void initBaseSetting(String groupId);

    /**
     * 查找考勤基础设置信息。
     *
     * @param groupId 考勤组ID
     * @return 考勤基础设置对象
     */
    AttendanceBaseSetting findBaseSetting(String groupId);

    /**
     * 查询用户外勤是否必须拍照
     * @param userInfo 用户信息
     * @return cn.hutool.json.JSONArray
     */
    JSONArray getTakePhotoSetting(UserInfo userInfo) throws QueryException;

    /**
     * 获取用户当前时间所处考勤组的内勤打卡基础设置
     */
    Integer getNowGroupAttendancePhoto();

    /**
     * 获取用户当前时间所处考勤组是否能外勤打卡
     * @param setting 考勤组配置
     */
    boolean getFieldClockStatusSelf(AttendanceBaseSetting setting);


    /**
     * 获取用户当前时间所处考勤组是否能快速打卡
     * 和用户当前所处考勤组的基础设置中的是否需要拍照，是否需要人脸识别以及App个人设置中的上下班快速打开相关
     */
    QuickCheckInVo quickCheckIn();

    /**
     * 获取用户当前时间所处考勤组是否能外勤打卡
     * @param groupId 考勤组
     */
    boolean getNeedFace(String groupId);

}
