package com.microservices.system.mapper;

import com.microservices.system.api.domain.SysUserDeptRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户与部门及部门内角色关联Mapper接口
 *
 * @author otto
 * @date 2023-04-11
 */
@Mapper
public interface SysUserDeptRoleMapper {
    /**
     * 查询用户与部门及部门内角色关联
     *
     * @param deptId 用户与部门及部门内角色关联主键
     * @return 用户与部门及部门内角色关联
     */
    public SysUserDeptRole selectSysUserDeptRoleByDeptId(Long deptId);

    /**
     * 查询用户与部门及部门内角色关联列表
     *
     * @param sysUserDeptRole 用户与部门及部门内角色关联
     * @return 用户与部门及部门内角色关联集合
     */
    public List<SysUserDeptRole> selectSysUserDeptRoleList(SysUserDeptRole sysUserDeptRole);

    /**
     * 新增用户与部门及部门内角色关联
     *
     * @param sysUserDeptRole 用户与部门及部门内角色关联
     * @return 结果
     */
    public int insertSysUserDeptRole(SysUserDeptRole sysUserDeptRole);

    /**
     * 修改用户与部门及部门内角色关联
     *
     * @param sysUserDeptRole 用户与部门及部门内角色关联
     * @return 结果
     */
    public int updateSysUserDeptRole(SysUserDeptRole sysUserDeptRole);

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

    /**
     * 获取部门下用户及用户角色列表
     *
     * @param nickName
     * @param deptId            部门id
     * @param userName          搜索条件
     * @param roleId
     * @param virtualRoleIdList
     * @return 部门下用户及用户角色列表
     */
    List<SysUserDeptRole> selectSysUserDeptRoleListByDeptId(
            @Param("deptId") Long deptId,
            @Param("userName") String userName,
            @Param("nickName") String nickName,
            @Param("roleId") String roleId,
            @Param("virtualRoleIdList") List<Long> virtualRoleIdList);

    int deleteSysUserDeptRoleByDeptIdAndUserIds(@Param("deptId") Long deptId, @Param("userIds") Long[] userIds);

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

    int deleteSysUserDeptRoleListByUserIdAndDeptIds(@Param("userId") Long userId, @Param("deptIds") Long[] deptIds);

    List<SysUserDeptRole> selectSysUserDeptRoleListByUserName(String userName);

    SysUserDeptRole selectSysUserDeptRoleByUserIdAndDeptId(@Param("userId") Long userId, @Param("deptId") Long deptId);

    /**
     * 基于组织和角色查询用户身份列表
     *
     * @param deptId
     * @param roleId
     * @return
     */
    List<SysUserDeptRole> selectSysUserDeptRoleByDeptIdAndRoleId(@Param("deptId") Long deptId, @Param("roleId") Long roleId);

    /**
     * 通过角色ID查询角色使用数量
     *
     * @param roleId
     * @return
     */
    int countUserRoleByRoleId(Long roleId);

    /**
     * 删除身份
     *
     * @param sysUserDeptRole
     * @return
     */
    int deleteSysUserDeptRole(SysUserDeptRole sysUserDeptRole);

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

    int countUserDeptRole(@Param("deptId") Long deptId, @Param("userId") Long userId, @Param("roleKey") String roleKey);

    /**
     * 根据角色Id查找所有身份
     *
     * @param roleId 角色Id
     * @return 身份列表
     */
    List<SysUserDeptRole> selectSysUserDeptRoleListByRoleId(Long roleId);

    /**
     * 批量更新用户身份状态
     *
     * @param deptId  组织Id
     * @param userIds 用户Id列表
     * @param state   状态
     * @return 结果
     */
    int updateUserIdentifyListState(@Param("deptId") Long deptId, @Param("userIds") Long[] userIds, @Param("state") String state);

    /**
     * 查询所有状态的用户身份
     *
     * @param userId 用户Id
     * @param deptId 组织Id
     * @return 用户身份
     */
    SysUserDeptRole selectUserIdentityByAllStatus(@Param("deptId") Long deptId, @Param("userId") Long userId);

    /**
     * 批量更新用户身份状态
     *
     * @param userId 用户Id
     * @param state  状态
     */
    void updateUserIdentifyStateByUserId(@Param("userId") Long userId, @Param("state") String state);
}
