package com.sunxung.factoring.service.sys;

import java.util.List;

import com.sunxung.factoring.entity.sys.Permission;
import com.sunxung.factoring.entity.sys.vo.PermissionTreeNode;
import com.sunxung.factoring.service.sys.dto.PermissionDTO;

public interface PermissionService {

    Permission add(Permission permission);

    Permission update(Permission permission);

    void delete(Long id);

    Permission get(Long id);

    List<Permission> findAll();

    Permission getByEname(String value);

    /**
     * 查询根节点
     * 
     * @return
     */
    List<PermissionTreeNode> findRootByParentId();

    /**
     * 查询角色根节点
     * 
     * @param roleId 角色ID
     * @return
     */
    List<PermissionTreeNode> findRootByParentId(Long roleId);

    /**
     * 查询修改根节点
     * 
     * @param parentId
     * @return
     */
    List<PermissionTreeNode> findUpdateRootByParentId(Long parentId);

    /**
     * 根据父权限ID和角色ID获取所有节点
     * 
     * @param parentId 父权限ID
     * @param roleId 角色ID
     * @return
     */
    List<PermissionTreeNode> findNodeByParentId(Long parentId, Long roleId);// 查询所有节点

    /**
     * 这里用一句话描述这个方法的作用
     * 
     * @param parentId
     * @return
     */
    List<PermissionTreeNode> findNodeByParentId(Long parentId);// 查询所有节点

    /**
     * 递归生成菜单树
     *
     * @return List<Permission> 树形菜单的集合
     */
    List<Permission> findPermisionTree();

    List<PermissionTreeNode> findUpdateNodeByParentId(Long parentId, Long roleId);

    /**
     * 删除角色与权限的关系
     * 
     * @param permissionId 权限ID
     * @param roleId 角色ID
     * @return
     */
    boolean deleteRolePermissionRel(Long permissionId, Long roleId);

    /**
     * 查询当前角色的权限下是否有子权限
     * 
     * @param parentId
     * @param roleId
     * @return
     */
    List<Long> findNodesByRoleIdPermissionId(Long parentId, Long roleId);

    /**
     * 根据角色ID，查询该角色下对应的权限ID的列表
     *
     * @param roleId 角色ID
     * @return List<Long> 返回权限ID的List集合
     */
    List<Long> getPermissionIdByRoleId(Long roleId);

    /**
     * 获取用户所有的权限ID. <br/>
     * 
     * @param userId
     * @return
     */
    List<Long> getPermissionIdByUserId(Long userId);

    /**
     * 根据用户ID，获取用户的所有的权限菜单
     *
     * @param userId 用户ID
     * @return List<Permission> 返回菜单集合
     */
    List<Permission> findAllByUserId(Long userId);


    /**
     * 根据用户ID，获取用户的所有权限ename
     *
     * @param userId
     * @return
     */
    PermissionDTO getAllPermissionEname(Long userId);
}
