package jnpf.authority.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.model.authority.dto.menu.FtbPermissionRoleAddDTO;
import jnpf.model.authority.dto.role.FtbPermissionDataDTO;
import jnpf.model.authority.dto.role.FtbPermissionRoleCopyDTO;
import jnpf.model.authority.dto.role.FtbPermissionRoleInfoDTO;
import jnpf.model.authority.dto.role.FtbPermissionRoleUpdateDTO;
import jnpf.model.authority.po.FtbPermissionRole;
import jnpf.model.authority.vo.role.FtbPermissionRoleDetailsVO;
import jnpf.model.authority.vo.role.FtbPermissionRoleIdentificationVO;
import jnpf.model.authority.vo.role.FtbPermissionRoleInfoVO;

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

/**
*
*
*@Author: peng.hao
*@create: 2025/3/5
*
*/
public interface FtbPermissionRoleService extends IService<FtbPermissionRole> {


    /**
     * 查询权限列表
     * <p>
     * 该方法用于根据给定的查询条件（FtbPermissionRoleInfoDTO）和分页信息（Page），
     * 查询出符合查询条件的权限角色信息列表，并将结果以分页的形式返回
     *
     * @param page        分页对象，包含分页查询所需的信息，如当前页码、每页记录数等
     * @param roleInfoDTO 查询条件对象，包含查询权限角色信息所需的条件，如角色名称、权限代码等
     * @return 返回一个分页对象，其中包含符合查询条件的权限角色信息列表
     */
    Page<FtbPermissionRoleInfoVO> permissionList(Page<FtbPermissionRoleInfoVO> page, FtbPermissionRoleInfoDTO roleInfoDTO);

    /**
     * 添加角色
     *
     * 该方法用于将一个新的角色添加到系统中
     * 它接收一个包含角色相关信息的数据对象作为参数
     *
     * @param ftbPermissionRoleAddDTO 包含待添加角色信息的数据传输对象
     */
    void addRole(FtbPermissionRoleAddDTO ftbPermissionRoleAddDTO);

    /**
     * 编辑角色信息
     *
     * 该方法用于更新角色的权限信息通过接收一个包含角色更新数据的DTO对象来实现这一功能
     *
     * @param roleUpdateDTO 角色更新数据传输对象，包含了需要更新的角色信息和权限数据
     */
    void editRole(FtbPermissionRoleUpdateDTO roleUpdateDTO);

    /**
     * 删除指定的角色
     *
     * 通过角色的唯一标识符id来删除角色这个方法表明了在角色管理系统中，
     * 一个角色可以通过其唯一的id来被删除这是一个基础的操作，用于维护角色信息的更新和管理
     *
     * @param id 角色的唯一标识符，用于标识和定位要删除的角色
     */
    void deleteRole(String id);

    /**
     * 获取权限角色识别信息集合
     * <p>
     * 该方法用于收集并返回一系列的权限角色识别信息，这些信息帮助确定用户在系统中的权限级别和角色
     * 它不接受任何参数，返回一个包含多个FtbPermissionRoleIdentificationVO对象的集合
     *
     * @return FtbPermissionRoleIdentificationVO 返回一个权限角色识别信息对象集合
     */
    FtbPermissionRoleIdentificationVO permissionIdentificationCollection();

    /**
     * 根据角色ID和菜单ID获取角色详细信息
     * 此方法用于获取特定角色在特定菜单下的权限详情
     *
     * @return 返回一个包含角色权限详细信息的对象
     */
    FtbPermissionRoleDetailsVO roleDetails(String roleId, String menuWebId, String menuAppId, String menuPcId);

    /**
     * 查询用户的权限范围
     * <p>
     * 通过用户ID查询该用户具有哪些资源的访问权限，以及对每个资源的具体操作权限
     * 查询结果以列表形式返回，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     *
     * @param userId 用户ID，用于标识和查询特定用户的权限信息
     * @return 返回一个列表，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     */
    Map<String, String> queryUserScopeOfPermission(String userId,String... tenantId);

    /**
     * 查询用户的权限范围
     * <p>
     * 通过用户ID查询该用户具有哪些资源的访问权限，以及对每个资源的具体操作权限
     * 查询结果以列表形式返回，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     *
     * @param userId 用户ID，用于标识和查询特定用户的权限信息
     * @return 返回一个列表，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     */
    Map<String, String> queryUserScopeOfPermissionNoTenant(String userId);

    /**
     * 复制角色及其权限信息
     * 此方法用于在系统中创建一个现有角色的副本，包括其所有权限和设置
     * 主要用途是当需要创建一个与现有角色权限相同的新角色时，避免手动重新配置所有权限
     *
     * @param ftbPermissionRole 要复制的角色信息，包含角色ID、名称等
     *                          此参数是复制操作的唯一输入，通过它传递角色的详细信息
     */
    void copyRole(FtbPermissionRoleCopyDTO ftbPermissionRole);

    /**
     * 当前人员最新具有的菜单权限列表
     * @param userId
     * @return
     */
    Set<String> queryTheLatestListOfMenuPermissions(String userId);

    /**
     * 将数据权限应用到其他模块
     * <p>
     * 此方法用于将当前配置的数据权限设置应用到系统中的其他相关模块，
     * 以确保数据权限规则在整个系统中保持一致性
     *
     * @param ftbPermissionDataDTO 包含数据权限配置信息的数据传输对象，
     *                             包括权限范围、授权对象等信息
     */
    void dataPermissionApplicationToOtherModules(FtbPermissionDataDTO ftbPermissionDataDTO);

    /**
     * 查询用户的权限范围
     * <p>
     * 通过用户ID查询该用户具有哪些资源的访问权限，以及对每个资源的具体操作权限
     * 查询结果以列表形式返回，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     *
     * @param userId 用户ID，用于标识和查询特定用户的权限信息
     * @return 返回一个列表，列表中的每个元素都是一个映射，映射的键是资源名称，值是该用户对该资源的操作权限
     */
   Map<String,Map<String, String>> queryUserScopeOfPermission(List<String> userId, String... tenantId);

}
