package com.microservices.system.service;

import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.system.api.domain.SysUserDeptRole;
import com.microservices.system.domain.dto.GitLinkUserDeptRoleByDeptInput;
import com.microservices.system.domain.dto.SysUserDeptRoleByDeptInput;
import com.microservices.system.domain.vo.GitLinkUserSearchVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户与部门及部门内角色关联Service接口
 *
 * @author otto
 * @date 2023-04-11
 */
public interface ISysUserDeptRoleService {

    /**
     * 查询用户与部门及部门内角色关联列表
     *
     * @param deptId
     * @param roleId
     * @return 用户与部门及部门内角色关联集合
     */
    public GenericsTableDataInfo<SysUserDeptRole> selectSysUserDeptRoleListByDept(Long deptId, String userName, String nickName, String roleId);

    /**
     * 批量删除用户与部门及部门内角色关联
     *
     * @param deptId 组织Id
     * @param userIds 需要删除的用户与部门及部门内角色关联主键集合
     * @return 结果
     */
    public int deleteSysUserDeptRoleByDeptIdAndUserIds(Long deptId, Long[] userIds);

    /**
     * 删除用户与部门及部门内角色关联信息
     *
     * @param deptId 用户与部门及部门内角色关联主键
     * @return 结果
     */
    public int deleteSysUserDeptRoleByDeptId(Long deptId);

    /**
     * 部门下批量新增用户及用户角色
     *
     * @param deptId              部门主键
     * @param sysUserDeptRoleByDeptInputs 用户及用户角色列表
     * @return 结果
     */
    int insertSysUserDeptRoleListByDept(Long deptId, SysUserDeptRoleByDeptInput[] sysUserDeptRoleByDeptInputs);

    int updateSysUserDeptRoleByDept(Long deptId, SysUserDeptRoleByDeptInput[] sysUserDeptRoleByDeptInputs);

    List<SysUserDeptRole> selectSysUserDeptRoleListByUser(@Param("userId") Long userId, Boolean isContainMember, @Param("deptName") String deptName, @Param("roleName") String roleName);

    List<SysUserDeptRole> selectSysUserDeptRoleListByUserName(String userName);

    SysUserDeptRole getFirstSysUserDeptRoleByUserName(String userName);

    /**
     * 获取当前登录用户身份列表
     *
     * @return
     */
    List<SysUserDeptRole> selectCurrentSysUserDeptRoleList();

    /**
     * 组织下批量新增GitLink用户及用户角色
     *
     * @param deptId
     * @param gitLinkUserDeptRoleByDeptInputs
     * @return
     */
    int insertGitLinkUserDeptRoleListByDept(Long deptId, GitLinkUserDeptRoleByDeptInput[] gitLinkUserDeptRoleByDeptInputs);

    /**
     * 通过组织Id查询组织下用户身份列表
     *
     * @param deptId
     * @return
     */
    List<SysUserDeptRole> selectSysUserDeptRoleListByDeptId(Long deptId);

    /**
     * 组织下新增用户身份
     *
     * @param deptId
     * @param userId
     * @param roleKey
     * @return
     */
    boolean insertSysUserDeptRole(Long deptId, Long userId, String roleKey);

    /**
     * 组织下删除用户身份
     *
     * @param deptId
     * @param userId
     * @param roleKey
     * @return
     */
    boolean deleteSysUserDeptRole(Long deptId, Long userId, String roleKey);

    /**
     * 初始化会员在对应仓库中权限
     */
    void initMemberRole();

    /**
     * 查询组织下身份列表
     *
     * @param deptId 组织id
     * @param search 模糊查询
     * @return 身份列表
     */
    List<SysUserDeptRole> selectSysUserDeptRoleListByDept(Long deptId, String search);

    Boolean checkUserInDeptHasRole(Long deptId, Long userId, String roleKey);

    GenericsTableDataInfo<JSONObject> selectGitlinkUserList(Long currentDeptId, GitLinkUserSearchVo gitLinkUserSearchVo);

    /**
     * 根据角色Id清理用户身份缓存
     *
     * @param roleId 角色Id
     */
    void updateUserLoginInfoByRoleId(Long roleId);

    int countUserRoleByRoleId(Long roleId);

    Boolean checkUserInDeptHasPerms(Long currentDeptId, Long userId, String perms);

    /**
     * 检查用户是否在部门下
     *
     * @param currentDeptId 部门id
     * @param userId        用户id
     * @return 是否存在
     */
    Boolean checkUserInDept(Long currentDeptId, Long userId);

    /**
     * 根据组织id更新用户身份信息
     *
     * @param deptId 组织id
     */
    void updateUserLoginInfoByDeptId(Long deptId);

    List<SysUserDeptRole> selectZoneUserIdentityListByUser(Long userId, Boolean isContainMember, String deptName, String roleName);

    SysUserDeptRole getAllStatusUserIdentityByDeptIdAndUserId(Long deptId, Long userId);

    /**
     * 注销用户时清理用户身份
     *
     * @param userId 用户Id
     */
    void deleteSysUserDeptRoleByDeleteUser(@Param("userId") Long userId);
}
