package com.ssyf.module.auth.service;

import com.ssyf.module.auth.domain.entity.MenuPermission;
import com.github.pagehelper.PageInfo;
import com.ssyf.module.auth.domain.query.MenuPermissionQuery;

import java.util.Arrays;
import java.util.List;

/**
* com.ssyf.module.auth.entity.Menu模型业务接口
* @author: auth
* @date: 2022-12-12
*/
public interface MenuPermissionService {

    /**
     * 新增菜单
     * @param query
     * @return
     */
    MenuPermission addOne(MenuPermissionQuery query);

    /**
     * 删除菜单
     * @param uid
     */
    void removeByUid(String uid);

    /**
     * 更新数据
     * @param uid
     * @param query
     */
    void updateByUid(String uid, MenuPermissionQuery query);

    /**
     * 获取指定编码的数据
     * @param uid
     * @return
     */
    MenuPermission getOneByUid(String uid);

    /**
     * 获取下级孩子的最后一条数据
     * @param uid
     * @return
     */
    MenuPermission getLastFormNextChildrenByUid(String uid);

    /**
     * 分页获取数据
     * @param query
     * @return
     */
    PageInfo<MenuPermission> getPage(MenuPermissionQuery query);

    /**
     * 获取全部数据
     * @param query
     * @return
     */
    List<MenuPermission> getList(MenuPermissionQuery query);

    /**
     * 获取指定上级的下级数据
     * @param parentId
     * @param query
     * @return
     */
    List<MenuPermission> getListChildren(String parentId, MenuPermissionQuery query);

    /**
     * 分页获取指定上级的下级数据
     * @param parentId
     * @param query
     * @return
     */
    PageInfo<MenuPermission> getPageChildren(String parentId, MenuPermissionQuery query);

    /**
     * 获取指定上级下一级的子数据
     * @param parentId
     * @param query
     * @return
     */
    List<MenuPermission> getListNextChildren(String parentId, MenuPermissionQuery query);

    /**
     * 分页获取指定上级的下一级的子数据
     * @param parentId
     * @param query
     * @return
     */
    PageInfo<MenuPermission> getPageNextChildren(String parentId, MenuPermissionQuery query);

    /**
     * 获取指定用户的关联的数据；
     * 使用场景：展示当前用户分配的菜单权限
     * @param userUid
     * @param query
     * @return
     */
    List<MenuPermission> getRelationListByUserUid(String userUid, MenuPermissionQuery query);


    /**
     * 获取指定用户的可见数据；
     * 使用场景：展示用户可操作的菜单权限
     * @param userUid
     * @param query
     * @return
     */
    List<MenuPermission> getVisibleByUserUid(String userUid, MenuPermissionQuery query);

    /**
     * 获取指定角色关联的数据
     * @param roleUid
     * @return
     */
    default List<MenuPermission> getListByRoleUid(String roleUid){
        return getListByRoleUid(Arrays.asList(roleUid));
    }

    /**
     * 获取指定角色关联的数据
     * @param roleUids
     * @return
     */
    List<MenuPermission> getListByRoleUid(List<String> roleUids);

    /**
     * 重新设置上下级关联编码；
     * 提示：不会修改数据内容，也不会修改关联关系，只对数据编码进行调整和排序
     * @param menuList
     */
    void resetPedigree(List<MenuPermission> menuList);

    /**
     * 获取指定编码的数据
     * @param menuPermissionUids
     * @return
     */
    List<MenuPermission> getListByUids(List<String> menuPermissionUids);

    /**
     * 重置用户关联菜单分享权限
     * @param userUid
     * @param menuPermissionUids
     */
    void resetUserRelationShare(String userUid, List<String> menuPermissionUids);
    /**
     * 获取指定用户的可见数据
     * @param userUid
     * @param query
     * @return
     */
    List<String> getVisibleMenusByUserUid(String userUid, MenuPermissionQuery query);


    void resetMenuPedigree();
}