package org.dromara.member.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.member.domain.AppRole;
import org.dromara.member.domain.bo.AppRoleBo;
import org.dromara.member.domain.vo.AppRoleVo;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * App端角色信息Service接口
 *
 * @author pengles
 */
public interface AppRoleService extends IService<AppRole> {

    /**
     * 查询App端角色信息
     *
     * @param roleId App角色ID
     * @return App端角色信息
     */
    AppRoleVo queryById(Long roleId);

    /**
     * 查询App端角色信息列表
     *
     * @param bo        App端角色信息
     * @param pageQuery 分页查询条件
     * @return App端角色信息集合
     */
    TableDataInfo<AppRoleVo> queryPageList(AppRoleBo bo, PageQuery pageQuery);

    /**
     * 查询App端角色信息列表
     *
     * @param bo App端角色信息
     * @return App端角色信息集合
     */
    List<AppRoleVo> queryList(AppRoleBo bo);

    /**
     * 新增App端角色信息
     *
     * @param bo App端角色信息
     * @return 结果
     */
    Boolean insertByBo(AppRoleBo bo);

    /**
     * 修改App端角色信息
     *
     * @param bo App端角色信息
     * @return 结果
     */
    Boolean updateByBo(AppRoleBo bo);

    /**
     * 校验并批量删除App端角色信息
     *
     * @param ids     主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 根据用户ID查询角色
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    List<AppRoleVo> selectRolesByUserId(Long userId);

    /**
     * 根据用户ID获取角色权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> selectRolePermissionByUserId(Long userId);

    /**
     * 查询所有角色
     *
     * @return 角色列表
     */
    List<AppRoleVo> selectRoleAll();

    /**
     * 根据用户ID获取角色选择框列表
     *
     * @param userId 用户ID
     * @return 选中角色ID列表
     */
    List<Long> selectRoleListByUserId(Long userId);

    /**
     * 校验角色名称是否唯一
     *
     * @param roleName 角色名称
     * @return 结果
     */
    boolean checkRoleNameUnique(String roleName);

    /**
     * 校验角色权限是否唯一
     *
     * @param roleKey 角色权限
     * @return 结果
     */
    boolean checkRoleKeyUnique(String roleKey);

    /**
     * 校验角色是否允许操作
     *
     * @param roleId 角色ID
     * @return 结果
     */
    boolean checkRoleAllowed(Long roleId);

    /**
     * 校验角色是否有数据权限
     *
     * @param roleId 角色ID
     * @return 结果
     */
    boolean checkRoleDataScope(Long roleId);

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

    /**
     * 取消授权用户角色
     *
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 结果
     */
    boolean deleteAuthUser(Long userId, Long roleId);

    /**
     * 批量取消授权用户角色
     *
     * @param roleId  角色ID
     * @param userIds 需要取消授权的用户数据ID
     * @return 结果
     */
    boolean deleteAuthUsers(Long roleId, Long[] userIds);

    /**
     * 批量选择授权用户角色
     *
     * @param roleId  角色ID
     * @param userIds 需要授权的用户数据ID
     * @return 结果
     */
    boolean insertAuthUsers(Long roleId, Long[] userIds);

}