package com.njcn.rdms.module.system.service.permission;

import com.njcn.rdms.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
import com.njcn.rdms.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
import com.njcn.rdms.module.system.dal.dataobject.permission.MenuDO;

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

public interface MenuService {

    Long createMenu(MenuSaveVO createReqVO);

    void updateMenu(MenuSaveVO updateReqVO);

    void deleteMenu(Long id);

    void deleteMenuList(List<Long> ids);

    List<MenuDO> getMenuList();

    List<MenuDO> filterDisableMenus(List<MenuDO> list);

    List<MenuDO> getMenuList(MenuListReqVO reqVO);

    /**
     * 获得指定作用域下的菜单列表
     *
     * @param reqVO 菜单查询条件
     * @param scopeType 作用域类型
     * @param objectType 对象类型
     * @return 菜单列表
     */
    List<MenuDO> getMenuList(MenuListReqVO reqVO, String scopeType, String objectType);

    List<Long> getMenuIdListByPermissionFromCache(String permission);

    /**
     * 从缓存中获得指定作用域下的权限菜单编号集合
     *
     * @param permission 权限标识
     * @param scopeType 作用域类型
     * @param objectType 对象类型
     * @return 菜单编号集合
     */
    List<Long> getMenuIdListByPermissionFromCache(String permission, String scopeType, String objectType);

    MenuDO getMenu(Long id);

    List<MenuDO> getMenuList(Collection<Long> ids);

    /**
     * 获得指定作用域下的菜单列表
     *
     * @param ids 菜单编号数组
     * @param scopeType 作用域类型
     * @param objectType 对象类型
     * @return 菜单列表
     */
    List<MenuDO> getMenuList(Collection<Long> ids, String scopeType, String objectType);

    /**
     * 校验菜单们是否有效。如下情况，视为无效：
     * 1. 菜单编号不存在
     * 2. 菜单被禁用
     *
     * @param ids 菜单编号数组
     */
    void validateMenuList(Collection<Long> ids);

    /**
     * 校验指定作用域下的菜单们是否有效
     *
     * @param ids 菜单编号数组
     * @param scopeType 作用域类型
     * @param objectType 对象类型
     */
    void validateMenuList(Collection<Long> ids, String scopeType, String objectType);

}
