package org.xyzh.api.system.menu;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.dto.menu.TbSysMenu;
import org.xyzh.common.dto.menu.TbSysMenuPermission;

/**
 * @description    MenuRemoteService.java文件描述 菜单远程服务接口
 * @filename    MenuRemoteService.java
 * @author    yslg
 * @copyright xyzh
 * @since 2025-09-26
 */
public interface MenuService {

    /**
     * @description    获取所有菜单
     * @return    ResultDomain<TbSysMenu> 菜单列表
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> getAllMenus();

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

    /**
     * @description    根据菜单ID查询菜单
     * @param    menuId 菜单ID
     * @return    ResultDomain<TbSysMenu> 菜单信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> getMenuById(String menuId);

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

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

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

    /**
     * @description    获取菜单树结构
     * @return    ResultDomain<TbSysMenu> 菜单树
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> getMenuTree();

    /**
     * @description    创建菜单
     * @param    menu 菜单对象
     * @return    ResultDomain<TbSysMenu> 创建结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> createMenu(TbSysMenu menu);

    /**
     * @description    更新菜单
     * @param    menu 菜单对象
     * @return    ResultDomain<TbSysMenu> 更新结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> updateMenu(TbSysMenu menu);

    /**
     * @description    删除菜单
     * @param    menuId 菜单ID
     * @return    ResultDomain<TbSysMenu> 删除结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> deleteMenu(String menuId);

    /**
     * @description    检查菜单名称是否存在
     * @param    menuName 菜单名称
     * @param    excludeId 排除的菜单ID（用于更新时排除自身）
     * @return    ResultDomain<Boolean> 是否存在
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<Boolean> checkMenuNameExists(String menuName, String excludeId);

    /**
     * @description    修改菜单状态
     * @param    menuId 菜单ID
     * @param    status 新状态
     * @return    ResultDomain<TbSysMenu> 修改结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> changeMenuStatus(String menuId, Integer status);

    /**
     * @description    修改菜单可见性
     * @param    menuId 菜单ID
     * @param    visible 可见性
     * @return    ResultDomain<TbSysMenu> 修改结果
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenu> changeMenuVisibility(String menuId, Boolean visible);

    /**
     * @description    查询菜单权限
     * @param    menuId 菜单ID
     * @return    ResultDomain<TbSysMenuPermission> 菜单权限信息
     * @author    yslg
     * @since 2025-09-28
     */
    ResultDomain<TbSysMenuPermission> getMenuPermission(String menuId);
}
