package com.yfd.platform.system.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.yfd.platform.annotation.Log;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.system.domain.SysMenu;
import com.yfd.platform.system.domain.SysUser;
import com.yfd.platform.system.service.ISysMenuService;
import com.yfd.platform.system.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileNotFoundException;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 菜单及按钮 前端控制器
 * </p>
 *
 *
 * @since 2021-12-15
 */
@RestController
@RequestMapping("/system/menu")
@Api(value = "SysMenuController", tags = "菜单及按钮")
public class SysMenuController {

    @Resource
    private ISysMenuService sysMenuService;

    @Resource
    private IUserService userService;

    //菜单图片路径
    @Value("${file-space.system}")
    private String systempath;

    /***********************************
     * 用途说明：获取菜单结构树（含按钮）
     * 参数说明
     *  systemcode      系统
     *  name            名称
     * isdisplay       是否显示
     * 返回值说明:  菜单结构树集合
     ***********************************/
    @PostMapping("/getMenuButtonTree")
    @ApiOperation("获取菜单结构树（含按钮）")
    @ResponseBody
    @PreAuthorize("@el.check('select:menu')")
    public List<Map<String, Object>> getMenuButtonTree(String systemcode,
                                                       String name,
                                                       String isdisplay) {
        return sysMenuService.getMenuButtonTree(systemcode, name, isdisplay);
    }

    /***********************************
     * 用途说明：获取菜单结构树（不含按钮）
     * 参数说明
     *  systemcode      系统
     *  name            名称
     *  isdisplay       是否显示
     * 返回值说明:  菜单结构树集合
     ***********************************/
    @PostMapping("/getMenuTree")
    @ApiOperation("获取菜单结构树（不含按钮）")
    @ResponseBody
    public List<Map<String, Object>> getMenuTree(String systemcode,
                                                 String name,
                                                 String isdisplay) {
        return sysMenuService.getMenuTree(systemcode, name, isdisplay);
    }

    /***********************************
     * 用途说明：权限分配
     * 参数说明
     *  systemcode      系统
     *  name            名称
     *  isdisplay       是否显示
     * 返回值说明:  菜单结构树集合
     ***********************************/
    @PostMapping("/permissionAssignment")
    @ApiOperation("获取分配权限（不含按钮）")
    @ResponseBody
    public List<Map<String, Object>> permissionAssignment(String code, String roleId) {
        if (StrUtil.isBlank(code)) {
            code = "1";
        }
        return sysMenuService.permissionAssignment(code, roleId);
    }

    /**********************************
     * 用途说明: 获取当前用户菜单结构树
     * 参数说明
     * 返回值说明: java.util.List<com.yfd.platform.system.domain.SysMenu>
     ***********************************/
    @GetMapping("/treeRoutes")
    @ApiOperation("获取当前用户菜单结构树")
    @ResponseBody
    public List<Map<String, Object>> getMenuTreeByUser() {
        SysUser userInfo = userService.getUserInfo();
        String id = "";
        if (0 != userInfo.getUsertype()) {
            id = userInfo.getId();
        }
        return sysMenuService.getMenuTree(id);
    }

    /**********************************
     * 用途说明: 获取当前用户菜单结构树
     * 参数说明
     * 返回值说明: java.util.List<com.yfd.platform.system.domain.SysMenu>
     ***********************************/
    @GetMapping("/getMenuTreeByType")
    @ApiOperation("根据系统类型获取用户菜单结构树")
    @ResponseBody
    public List<Map<String, Object>> getMenuTreeByType(String sysetmCode) {
        SysUser userInfo = userService.getUserInfo();
        String id = "";
        if (0 != userInfo.getUsertype()) {
            id = userInfo.getId();
        }
        return sysMenuService.getMenuTreeByType(id, sysetmCode);
    }

    /***********************************
     * 用途说明：根据id查询菜单或按钮详情
     * 参数说明
     * id        菜单或按钮表id
     * 返回值说明:   菜单或按钮表对象
     ***********************************/
    @PostMapping("/getOneById")
    @ApiOperation("根据id查询菜单或按钮详情")
    @ResponseBody
    public ResponseResult getOneById(String id) {
        SysMenu sysMenu = sysMenuService.getById(id);
        return ResponseResult.successData(sysMenu);
    }

    /***********************************
     * 用途说明：新增菜单及按钮
     * 参数说明
     * sysMenu        菜单或按钮表对象
     * 返回值说明:   是否添加成功提示
     ***********************************/
    @Log(module = "菜单及按钮", value = "新增菜单及按钮！",type = "0")
    @PostMapping("/addMenu")
    @ApiOperation("新增菜单及按钮")
    @ResponseBody
    public ResponseResult addMenu(@RequestBody SysMenu sysMenu) {
        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysMenu::getSystemcode, sysMenu.getSystemcode()).eq(SysMenu::getType, sysMenu.getType()).eq(SysMenu::getName, sysMenu.getName());
        int count = sysMenuService.count(queryWrapper);
        if (count > 0) {
            return ResponseResult.error("当前菜单或按钮已经存在！");
        }
        boolean isOk = sysMenuService.addMenu(sysMenu);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：修改菜单及按钮
     * 参数说明
     * sysMenu        菜单或按钮表对象
     * 返回值说明:   是否修改成功提示
     ***********************************/
    @Log(module = "菜单及按钮", value = "修改菜单及按钮",type = "0")
    @PostMapping("/updateById")
    @ApiOperation("修改菜单及按钮")
    @ResponseBody
    public ResponseResult updateById(@RequestBody SysMenu sysMenu) {
        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.ne(SysMenu::getId, sysMenu.getId()).eq(SysMenu::getSystemcode, sysMenu.getSystemcode()).eq(SysMenu::getType, sysMenu.getType()).eq(SysMenu::getName, sysMenu.getName());
        int count = sysMenuService.count(queryWrapper);
        if (count > 0) {
            return ResponseResult.error("当前菜单或按钮已经存在！");
        }
        sysMenu.setLastmodifier(userService.getUsername());
        sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        boolean isOk = sysMenuService.updateById(sysMenu);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：根据id删除单个图标
     * 参数说明
     * id          删除图标id
     * icon        图标名称
     * 返回值说明:   是否删除成功
     ***********************************/
    @Log(module = "菜单及按钮", value = "根据id删除单个图标！",type = "0")
    @PostMapping("/deleteIcon")
    @ApiOperation("根据id删除单个图标")
    @ResponseBody
    public ResponseResult deleteIcon(@RequestParam String id) {
        boolean ok = sysMenuService.deleteIcon(id);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：更新菜单及按钮是否有效
     * 参数说明
     * id          菜单及按钮表id
     * isdisplay   是否有效字段
     * 返回值说明: 是否更新成功
     ***********************************/
    @Log(module = "菜单及按钮", value = "更新菜单及按钮是否有效！",type = "0")
    @PostMapping("/setIsDisplay")
    @ApiOperation("更新菜单及按钮是否有效")
    @ResponseBody
    public ResponseResult setIsDisplay(String id, String isdisplay) {
        UpdateWrapper<SysMenu> updateWrapper = new UpdateWrapper<>();
        //根据id 修改是否显示 ，最近修改人，最近修改时间
        updateWrapper.eq("id", id).set("isdisplay", isdisplay).set(
                "lastmodifier", userService.getUsername()).set(
                "lastmodifydate",
                new Timestamp(System.currentTimeMillis()));
        boolean ok = sysMenuService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：菜单及按钮序号排序
     * 参数说明
     * parentid    上级id
     * orderMap   map<菜单及按钮表id,排列序号>
     * 返回值说明:   是否更新成功
     ***********************************/
    @Log(module = "菜单及按钮", value = "菜单及按钮序号排序！",type = "0")
    @PostMapping("/moveOrderno")
    @ApiOperation("菜单及按钮序号排序")
    @ResponseBody
    public ResponseResult moveOrderno(@RequestParam String parentid,
                                      @RequestParam String id,
                                      @RequestParam int orderno) {
        boolean ok = sysMenuService.moveOrderno(parentid, id, orderno);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：根据id删除菜单或按钮
     * 参数说明
     * id        删除列的id
     * 返回值说明:   是否删除成功
     ***********************************/
    @Log(module = "菜单及按钮", value = "根据id删除菜单或按钮！",type = "0")
    @PostMapping("/deleteById")
    @ApiOperation("根据id删除菜单或按钮")
    @ResponseBody
    public ResponseResult deleteById(@RequestParam String id) {
        boolean ok = sysMenuService.deleteById(id);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /**********************************
     * 用途说明: 菜单或者按钮拖动
     * 参数说明 id
     * 参数说明 id1
     * 返回值说明: com.yfd.platform.config.ResponseResult
     ***********************************/
    @Log(module = "菜单及按钮", value = "拖动修改菜单或按钮同级顺序！")
    @PostMapping("/changeMenuOrder")
    @ApiOperation("菜单或按钮切换")
    @ResponseBody
    public ResponseResult changeMenuOrder(@RequestParam String fromId,
                                          @RequestParam String toId) {
        if (StrUtil.isBlank(fromId) || StrUtil.isBlank(toId)) {
            return ResponseResult.error("参数为空！");
        }
        if (fromId.equals(toId)) {
            return ResponseResult.error("切换失败！");
        }
        boolean ok = sysMenuService.changeOderNoById(fromId, toId);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：上传单个图标
     * 参数说明
     * icon        图标
     * 返回值说明:   是否上传成功
     ***********************************/
    @PostMapping("/uploadIcon")
    @ApiOperation("上传单个图标")
    @ResponseBody
    public ResponseResult uploadIcon(MultipartFile icon, String menuId) throws FileNotFoundException {
        if (StrUtil.isNotBlank(menuId)) {
            SysMenu sysMenu = sysMenuService.getById(menuId);

            //图片路径
            //            String iconname =
            //                    System.getProperty("user.dir") + "\\riis-system\\src\\main" +
            //                            "\\resources\\static\\icon" + File.separator + sysMenu.getIcon();
            String iconname = systempath.replace("\\", "/") + "menuicon" + File.separator + sysMenu.getIcon();
            //删除图标
            new File(iconname).delete();
        }
        String filename = sysMenuService.uploadIcon(icon);
        SysMenu sysMenu = new SysMenu();
        sysMenu.setId(menuId);
        sysMenu.setIcon(filename);
        sysMenuService.updateById(sysMenu);
        return ResponseResult.successData(filename);
    }
}
