package org.nl.system.service.menu;

import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.domain.vo.MenuVo;
import org.nl.system.service.menu.dao.SysMenu;
import org.nl.system.service.menu.dto.MenuDto;
import org.nl.system.service.menu.dto.MenuQuery;

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

/**
 * <p>
 * 菜单表 服务类
 * </p>
 *
 * @author ldjun
 * @since 2022-12-15
 */
public interface ISysMenuService extends IService<SysMenu> {
    /**
     * 查询全部数据,菜单不使用分页
     *
     * @param param 查询条件
     * @return
     */
    List<MenuDto> queryAll(Map<String, Object> param);

    /**
     * 条件查询
     * @param query
     * @param page
     * @return
     */
    List query(MenuQuery query, PageQuery page);

    /**
     * 根据ID获取同级与上级数据
     *
     * @param menuDto 菜单对象
     * @param menus
     * @return /
     */
    List<MenuDto> getSuperior(MenuDto menuDto, List<SysMenu> menus);

    /**
     * 根据ID查询 菜单对象
     *
     * @param id 菜单标识
     * @return 菜单对象
     */
    SysMenu findById(String id);

    /**
     * 根据菜单父节点标识查询菜单列表
     *
     * @param pid
     * @return 菜单列表
     */
    List<SysMenu> findByPid(String pid);

    /**
     * 查询父节点为空的菜单列表
     *
     * @return 菜单列表
     */
    List<SysMenu> findByPidIsNull();

    /**
     * 获取所有子节点，包含自身ID
     *
     * @param menuList
     * @param menuSet
     * @return /
     */
    Set<SysMenu> getChildMenus(List<SysMenu> menuList, Set<SysMenu> menuSet);

    /**
     * 创建
     *
     * @param menu
     */
    void create(SysMenu menu);

    /**
     * 删除
     *
     * @param menuSet
     */
    void delete(Set<SysMenu> menuSet);

    /**
     * 编辑
     *
     * @param menu
     */
    void update(SysMenu menu);


    List<MenuDto> findByUser(String userId);

    /**
     * 构建菜单树
     *
     * @param menuDtos
     * @return /
     */
    List<MenuVo> buildMenus(List<MenuDto> menuDtos);
    List<MenuVo> buildMenus(List<MenuDto> menuDtos,String pid);

    List<MenuVo> buildMenus(String systemType);

    /**
     * 构建菜单树
     *
     * @param menuDtos 原始数据
     * @return /
     */
    List<MenuDto> buildTree(List<MenuDto> menuDtos);

    /**
     * 懒加载菜单数据
     *
     * @param pid /
     * @return /
     */
    List<SysMenu> getMenus(String pid);

    /**
     * @param sysMenu
     * @return
     */
    MenuDto doToDto(SysMenu sysMenu);

    List<Map> getMenusByRole(String roleId, String systemType, String category);

}
