package com.bonus.system.api;

import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.constant.ServiceNameConstants;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.system.api.domain.SysMenu;
import com.bonus.system.api.factory.RemoteMenuFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * @author wangvivi
 */
@FeignClient(contextId = "remoteMenuService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteMenuFallbackFactory.class)
public interface RemoteMenuService {

    /**
     * 根据菜单名或状态（显示或隐藏）或状态（正常或停用）获取菜单列表
     * @param menu 菜单的查询条件，如菜单名或状态（显示或隐藏）或状态（正常或停用）
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 满足要求的菜单列表
     */
    @GetMapping("/menu/list")
    public AjaxResult list(SysMenu menu, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据菜单编号获取详细信息
     * @param menuId 菜单id列表
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 菜单详情
     *
     */
    @GetMapping(value = "/menu/{menuId}")
    public AjaxResult getInfo(@PathVariable("menuId") Long menuId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据菜单的查询条件，如菜单名或状态（显示或隐藏）或状态（正常或停用），获取菜单下拉树列表
     * @param menu 菜单的查询条件，如菜单名或状态（显示或隐藏）或状态（正常或停用）
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 菜单下拉树列表
     */
    @GetMapping("/menu/treeselect")
    public AjaxResult treeselect(SysMenu menu, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 加载对应角色菜单列表树
     * @param roleId 角色id
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 结果
     */
    @GetMapping(value = "/menu/roleMenuTreeselect/{roleId}")
    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 新增菜单
     * @param menu 新增的菜单信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 新增成功影响的行数或错误码和错误消息
     */
    @PostMapping("/menu")
    public AjaxResult add(@Validated @RequestBody SysMenu menu, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改菜单
     * @param menu 修改的菜单信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 修改成功影响的行数或错误码和错误消息
     */
   @PostMapping("/menu/edit")
    public AjaxResult edit(@Validated @RequestBody SysMenu menu, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 查询当前登录用户的菜单树信息
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 当前登录用户的菜单树信息
     */
    @GetMapping("/menu/getRouters")
    public AjaxResult getRouters(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
