package jnpf.attendance.service;

import jnpf.exception.HandleException;
import jnpf.model.attendance.dto.BatchSaveGroupAdmin;
import jnpf.model.attendance.dto.GroupFilterDto;
import jnpf.model.attendance.dto.SaveGroupAdmin;
import jnpf.model.attendance.dto.SaveSuperAdminDto;
import jnpf.model.attendance.vo.AttendanceManagerDetailVo;
import jnpf.model.attendance.vo.AttendanceUserVo;
import jnpf.model.attendance.vo.CurUserPermissionVo;
import jnpf.model.attendance.vo.permission.ActionPermissionVo;
import jnpf.model.attendance.vo.permission.ApprovalSettingVo;
import jnpf.model.attendance.vo.permission.AttendanceTeamSetVo;
import jnpf.model.attendance.vo.permission.app.ManagerPermissionVo;
import jnpf.model.authority.vo.role.FtbPermissionPositionMenuVO;

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

public interface AttendanceSuperAdminService {

    /**
     * 添加考勤组考勤管理员
     * @param saveSuperAdminDto 保存信息
     */
    void add(SaveSuperAdminDto saveSuperAdminDto) throws HandleException;

    /**
     * 删除超级管理员
     * @param userIds 用户id
     */
    void delete(List<String> userIds);

    /**
     * 获取考勤组超级管理员列表
     * @return List<AttendanceUserVo>
     */
    List<AttendanceUserVo> querySuperAdmin(String name);

    /**
     * 保存考勤组管理员
     * @param saveGroupAdmin 保存信息
     */
    void addGroupAdmin(SaveGroupAdmin saveGroupAdmin) throws Exception;

    /**
     * 批量添加考勤组管理员
     * @param batchSaveGroupAdmin 保存信息
     */
    void batchAddGroupAdmin(BatchSaveGroupAdmin batchSaveGroupAdmin);

    /**
     * 修改考勤组管理员权限
     * @param saveGroupAdmin 保存信息
     */
    void updateGroupAdmin(SaveGroupAdmin saveGroupAdmin);

    /**
     * 删除考勤组管理员
     */
    void deleteGroupAdmin(SaveGroupAdmin saveGroupAdmin);

    /**
     * 查看考勤组下管理员列表
     * @param groupId 考勤组
     * @return List<AttendanceGroupAdminVo>
     */
    Map<String, Object> listGroupAdmin(String groupId);

    /**
     * 获取管理员，包含当前组管理员、上级子组权限管理员、超级管理员，其中key为 -1时超级管理员集合
     * @param groupIds 考勤组id集合
     * @return Map<String, List < String>> key为 groupId value为管理员userId集合
     */
    Map<String, List<String>> queryUserForCurrAndUpChildAndSuper(List<String> groupIds);

    /**
     * 根据指定条件查询权限信息
     * 该方法通过接收群组ID、父权限代码和子权限代码列表作为参数，
     * 查询并返回一个映射，其中键为群组ID，值为该群组下匹配指定权限代码的权限列表
     *
     * @param groupIds 群组ID列表，用于指定需要查询权限的群组
     * @param parentCodes 父权限代码列表，用于指定需要查询的父权限范围
     * @param childCodes 子权限代码列表，用于指定需要查询的子权限范围
     * @return 返回一个映射，每个键值对表示一个群组及其对应的权限列表
     */
    Map<String, List<String>> queryPermissionBySpecify(List<String> groupIds, List<String> parentCodes, List<String> childCodes);

    /**
     * 获取当前登录用户权限
     * @param groupId 考勤组id
     * @return CurUserPermissionVo
     */
    CurUserPermissionVo getByUserId(String groupId);

    /**
     * 是否是考勤超级管理员
     * @param userId 用户id
     * @return Boolean
     */
    Boolean isSuperAdmin(String userId);

    /**
     * 考勤组管理员详情
     * @param groupId 考勤组id
     * @param userId 用户id
     * @return AttendanceGroupVo
     */
    AttendanceManagerDetailVo adminDetail(String groupId, String userId);

    /**
     * 获取当前用户权限
     * @param userId 用户id
     * @param levelCodeList 考勤组层级编码
     * @param permissionName 权限名称
     * @return CurUserPermissionVo
     */
    CurUserPermissionVo queryPermissionByUserId(String userId, List<String> levelCodeList, String permissionName);

    /**
     * 是否有查看权限
     * @param groupId 考勤组id
     * @return Boolean
     */
    Boolean isViewPermission(String groupId);

    /**
     * 获取操作权限
     * @param groupId 考勤组id
     * @return ActionPermissionVo
     */
    ActionPermissionVo getActionPermission(String groupId);

    /**
     * 是否是考勤组超级管理员||系统超级管理员
     * @return Boolean
     */
    Boolean isGlobalSetting();

    /**
     * 是否是考勤组管理员
     * @return ManagerPermissionVo
     */
    ManagerPermissionVo isManager();

    /**
     * 获取考勤组审批设置
     * @param groupId 考勤组id
     * @param type 审批类型 1.常规补卡审批 2.调整出勤结果审批 3.外勤审批 4.请假审批 5.加班审批
     * @return ApprovalSettingVo
     */
    ApprovalSettingVo getApprovalSettingInfo(String groupId, Integer type);

    /**
     * 根据用户id集合查询所属的权限-查询所有权限
     * @param userIds 用户id集合
     * @return FtbPermissionPositionMenuVO.FtbPermissionPositionMenuInnerVO
     */
    List<FtbPermissionPositionMenuVO.FtbPermissionPositionMenuInnerVO> queryPermissionListByUserIds(List<String> userIds);

    /**
     * 获取考勤组设置
     *
     * @param dto 考勤组id
     * @return AttendanceTeamSetVo
     */
    AttendanceTeamSetVo getTeamSet(GroupFilterDto dto);

    /**
     * 设置月报通知
     *
     * @param dto 考勤组id
     * @return Boolean
     */
    Boolean setMonthNotice(GroupFilterDto dto);
}
