package org.xyzh.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.menu.TbSysMenu;

import java.util.List;

/**
 * @description MenuMapper.java文件描述 菜单数据访问层
 * @filename MenuMapper.java
 * @author yslg
 * @copyright xyzh
 * @since 2025-09-28
 */
@Mapper
public interface MenuMapper extends BaseMapper<TbSysMenu> {

    /**
     * @description 查询所有菜单
     * @return List<TbSysMenu> 菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectAllMenus();

    /**
     * @description 查询菜单列表
     * @param filter 过滤条件
     * @return List<TbSysMenu> 菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectMenuList(TbSysMenu filter);

    /**
     * @description 查询菜单
     * @param menuId 菜单ID
     * @return TbSysMenu 菜单
     * @author yslg
     * @since 2025-09-28
     */
    TbSysMenu selectMenuById(String menuId);

    /**
     * @description 根据用户ID查询菜单列表
     * @param userId 用户ID
     * @return List<TbSysMenu> 菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectMenusByUserId(@Param("userId") String userId);

    /**
     * @description 根据角色ID查询菜单列表
     * @param roleId 角色ID
     * @return List<TbSysMenu> 菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectMenusByRoleId(@Param("roleId") String roleId);

    /**
     * @description 根据父菜单ID查询子菜单列表
     * @param parentId 父菜单ID
     * @return List<TbSysMenu> 子菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectByParentId(@Param("parentId") String parentId);

    /**
     * @description 查询菜单树结构
     * @return List<TbSysMenu> 菜单树
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> selectMenuTree();

    /**
     * @description 检查菜单名称是否存在
     * @param menuName 菜单名称
     * @param excludeId 排除的菜单ID
     * @return int 存在数量
     * @author yslg
     * @since 2025-09-28
     */
    int countByMenuName(@Param("menuName") String menuName, @Param("excludeId") String excludeId);

    /**
     * @description 批量删除菜单（逻辑删除）
     * @param menuIds 菜单ID列表
     * @param updater 更新人
     * @return int 影响行数
     * @author yslg
     * @since 2025-09-28
     */
    int batchDeleteByIds(@Param("menuIds") List<String> menuIds, @Param("updater") String updater);

    /**
     * @description 检查菜单是否存在
     * @param menuIds 菜单ID列表
     * @return List<TbSysMenu> 菜单列表
     * @author yslg
     * @since 2025-09-28
     */
    List<TbSysMenu> checkMenuExists(@Param("menuIds") List<String> menuIds);
}
