package com.ruoyi.web.report.mapper;

import org.apache.ibatis.annotations.Param;

/**
 * 报表动态菜单 Mapper。
 */
public interface ReportMenuMapper {
    /**
     * 查询“报表中心”根目录 ID。
     */
    Long selectRootMenuId();

    /**
     * 创建“报表中心”根目录。
     */
    int insertRootMenu(@Param("createBy") String createBy);

    /**
     * 新增菜单。
     */
    int insertMenu(@Param("menuName") String menuName,
                   @Param("parentId") Long parentId,
                   @Param("orderNum") Integer orderNum,
                   @Param("path") String path,
                   @Param("component") String component,
                   @Param("query") String query,
                   @Param("perms") String perms,
                   @Param("icon") String icon,
                   @Param("createBy") String createBy);

    /**
     * 查询最新插入菜单 ID。
     */
    Long selectLastInsertMenuId();

    /**
     * 更新菜单信息。
     */
    int updateMenuById(@Param("menuId") Long menuId,
                       @Param("menuName") String menuName,
                       @Param("path") String path,
                       @Param("component") String component,
                       @Param("query") String query,
                       @Param("status") String status,
                       @Param("updateBy") String updateBy);

    /**
     * 根据父菜单与 path 查询菜单 ID。
     */
    Long selectMenuIdByParentAndPath(@Param("parentId") Long parentId, @Param("path") String path);

    /**
     * 新增报表与菜单绑定关系。
     */
    int insertMenuBinding(@Param("reportId") Long reportId,
                          @Param("menuId") Long menuId,
                          @Param("menuPath") String menuPath,
                          @Param("component") String component,
                          @Param("queryText") String queryText,
                          @Param("createBy") String createBy);

    /**
     * 更新报表与菜单绑定关系。
     */
    int updateMenuBinding(@Param("reportId") Long reportId,
                          @Param("menuId") Long menuId,
                          @Param("menuPath") String menuPath,
                          @Param("component") String component,
                          @Param("queryText") String queryText,
                          @Param("updateBy") String updateBy);

    /**
     * 给管理员角色补授权（幂等）。
     */
    int insertAdminRoleMenuIfAbsent(@Param("menuId") Long menuId);

    /**
     * 按角色授权菜单（幂等）。
     */
    int insertRoleMenuIfAbsent(@Param("roleId") Long roleId, @Param("menuId") Long menuId);

    /**
     * 给指定用户名对应的全部启用角色授权菜单（幂等）。
     */
    int insertRoleMenusByUserNameIfAbsent(@Param("userName") String userName, @Param("menuId") Long menuId);

    /**
     * 查询某父菜单下最大排序号。
     */
    Integer selectMaxOrderNumByParentId(@Param("parentId") Long parentId);
}
