package org.rcisoft.sys.menu.controller;


import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.rcisoft.common.controller.ResponseController;
import org.rcisoft.common.model.CommonMenuModel;
import org.rcisoft.common.model.TreeViewModel;
import org.rcisoft.core.constant.MessageConstant;
import org.rcisoft.core.model.PersistModel;
import org.rcisoft.core.result.Result;
import org.rcisoft.sys.menu.entity.SysMenu;
import org.rcisoft.sys.menu.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * Created by lcy on 16/7/30.
 */
@RestController
@RequestMapping("/menu")
public class SysMenuController extends ResponseController {

    @Autowired
    private SysMenuService sysMenuServiceImpl;


    @ApiOperation(value="构建  treeView", notes="构建  treeView")
    @GetMapping("queryMenusForTree")
    public List<TreeViewModel> queryTreeView(){

        return sysMenuServiceImpl.queryMenuTree();
    }

    @ApiOperation(value="根据角色ID获取菜单", notes="根据角色ID获取菜单(已获取权限的为选中状态)")
    @ApiImplicitParam(name = "id", value = "角色ID", required = true, dataType = "varchar", paramType = "path")
    @GetMapping("queryMenusOfRolePermission")
    public List<TreeViewModel> queryMenusOfRolePermission(String id){
        return sysMenuServiceImpl.queryMenuTreeForSelectedByRP(id);
    }

    @ApiOperation(value="根据id 查询 menu", notes="根据id 查询 menu")
    @ApiImplicitParam(name = "id", value = "businessId", required = true, dataType = "Integer", paramType = "path")
    @GetMapping("queryMenuById/{id}")
    public Result queryMenuById(@PathVariable("id") String id){

        SysMenu menu = sysMenuServiceImpl.queryMenuById(id);
        return Result.builder(new PersistModel(1),
                MessageConstant.MESSAGE_ALERT_SUCCESS,
                MessageConstant.MESSAGE_ALERT_ERROR,
                menu);
    }


    @ApiOperation(value="增加菜单code", notes="true:合法;false:不合法;不能有其它的输出")
    @ApiImplicitParam(name = "menuCode", value = "菜单编号", required = false, dataType = "varchar")
    @PostMapping("queryMenuCodeValidate")
    public String queryDeptCodeValidate(@RequestParam("menuCode") String menuCode){

        return "true";
    }

    @ApiOperation(value="增加菜单", notes="增加菜单")
    @ApiImplicitParams({@ApiImplicitParam(name = "businessId", value = "businessId", required = true, dataType = "Integer", paramType = "path"),
            @ApiImplicitParam(name = "parentIds", value = "所有父级编号", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "name", value = "名称", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "href", value = "链接", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "target", value = "目标( mainFrame、_blank、_self、_parent、_top)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "icon", value = "图标", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "sort", value = "排序", required = false, dataType = "Integer"),
            @ApiImplicitParam(name = "isShow", value = "是否在菜单中显示(1:显示;0:不显示)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "isActiviti", value = "是否同步到工作流(1:同步;0:不同步)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "permission", value = "权限标识", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "parentId", value = "parent id", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "code", value = "菜单编号", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "modelId", value = "model ID  in sys_model", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "remarks", value = "备注", required = false, dataType = "varchar")})
    @PostMapping("adminLog/menuAdd")
    public Result menuAdd(@Valid SysMenu menu, BindingResult br){
        PersistModel persistModel = sysMenuServiceImpl.persistMenu(menu,getToken());
        return Result.builder(persistModel,
                MessageConstant.MESSAGE_ALERT_SUCCESS,
                MessageConstant.MESSAGE_ALERT_ERROR,
                menu);
    }

    @ApiOperation(value="修改菜单", notes="修改菜单")
    @ApiImplicitParams({@ApiImplicitParam(name = "businessId", value = "businessId", required = true, dataType = "Integer", paramType = "path"),
            @ApiImplicitParam(name = "parentIds", value = "所有父级编号", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "name", value = "名称", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "href", value = "链接", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "target", value = "目标( mainFrame、_blank、_self、_parent、_top)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "icon", value = "图标", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "sort", value = "排序", required = false, dataType = "Integer"),
            @ApiImplicitParam(name = "isShow", value = "是否在菜单中显示(1:显示;0:不显示)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "isActiviti", value = "是否同步到工作流(1:同步;0:不同步)", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "permission", value = "权限标识", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "parentId", value = "parent id", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "code", value = "菜单编号", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "modelId", value = "model ID  in sys_model", required = false, dataType = "varchar"),
            @ApiImplicitParam(name = "remarks", value = "备注", required = false, dataType = "varchar")})
    @PostMapping("adminLog/menuUpdate")
    public Result menuUpdate(@Valid SysMenu menu, BindingResult br){
        PersistModel persistModel = sysMenuServiceImpl.mergeMenu(menu,getToken());
        return Result.builder(persistModel,
                MessageConstant.MESSAGE_ALERT_SUCCESS,
                MessageConstant.MESSAGE_ALERT_ERROR,
                menu);
    }

    @ApiOperation(value="删除菜单", notes="根据id删除菜单")
    @ApiImplicitParam(name = "id", value = "businessId", required = true, dataType = "varchar", paramType = "path")
    @PostMapping("adminLog/menuDelete/{id}")
    public Result menuDelete(@PathVariable("id") String id){

        PersistModel persistModel = sysMenuServiceImpl.removeMenu(id,getToken());
        return Result.builder(persistModel,
                MessageConstant.MESSAGE_ALERT_SUCCESS,
                MessageConstant.MESSAGE_ALERT_ERROR,
                id);
    }


    @ApiOperation(value="列出菜单", notes="列出菜单")
    @GetMapping("/queryMenus")
    public Result queryMenus(){
        List<SysMenu> menus = sysMenuServiceImpl.queryMenus();
        return Result.builder(new PersistModel(1),
                MessageConstant.MESSAGE_ALERT_SUCCESS,
                MessageConstant.MESSAGE_ALERT_ERROR,
                menus);
    }
}