package cn.wisenergy.chnmuseum.party.web.controller;

import cn.wisenergy.chnmuseum.party.core.annotations.OperationLog;
import cn.wisenergy.chnmuseum.party.model.Menu;
import cn.wisenergy.chnmuseum.party.model.RoleMenu;
import cn.wisenergy.chnmuseum.party.service.impl.MenuServiceImpl;
import cn.wisenergy.chnmuseum.party.service.impl.RoleMenuServiceImpl;
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.*;

/**
 * <p>
 * 菜单权限 前端控制器
 * </p>
 *
 * @author 杨智平
 * @since 2018-08-03
 */
@Api(tags = "菜单权限接口")
@RestController
@RequestMapping("/menu")
public class MenuController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(MenuController.class);

    @Resource
    private MenuServiceImpl menuService;

    @Resource
    private RoleMenuServiceImpl roleMenuService;

    /**
     * 获取单个菜单信息
     *
     * @param Id
     * @return
     */
    @ApiOperation(value = "获取单个菜单信息")
    @RequestMapping(value = "/get", method = RequestMethod.GET)
    @RequiresAuthentication  //@RequiresPermissions("/menu/get")
    public ResponseEntity<Menu> get(String Id) {
        try {
            Menu menu = menuService.getById(Id);
            if (null == menu) {
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
            }
            return ResponseEntity.ok(menu);
        } catch (Exception e) {
            logger.error("查询菜单错误!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    /**
     * 查询菜单列表
     *
     * @param name
     * @return
     */
    @ApiOperation(value = "查询菜单列表")
    @RequestMapping(value = "/getMenuList", method = RequestMethod.GET)
    @RequiresAuthentication  //@RequiresPermissions("/menu/getMenuList")
    public ResponseEntity<Page<Menu>> queryUserList(String name, String url) {
        try {
            QueryWrapper<Menu> ew = new QueryWrapper<>();
            if (StringUtils.isNotBlank(name)) {
                ew.like("menu_name", name);
            }
            if (StringUtils.isNotBlank(url)) {
                ew.like("menu_url", url);
            }
            ew.eq("is_deleted", 0).orderByAsc("sort");
            Page<Menu> page = getPage();
            Page<Menu> employeePage = menuService.page(page, ew);
            return ResponseEntity.ok(employeePage);
        } catch (Exception e) {
            logger.error("查询成员列表出错!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    // 添加
    @OperationLog("添加菜单")
    @ApiOperation(value = "添加")
    @PostMapping(value = "/add")
    @RequiresAuthentication  //@RequiresPermissions("/menu/add")
    public ResponseEntity<Map<String, Object>> add(Menu menu) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            boolean ret = false;
            if (StringUtils.isBlank(menu.getName())) {
                resultMap.put("status", "400");
                resultMap.put("message", "菜单名称不能为空!");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }
            if (StringUtils.isBlank(String.valueOf(menu.getUrl()))) {
                resultMap.put("status", "400");
                resultMap.put("message", "Url不能为空");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }

            if (!menu.getParentId().equals("0")) {
                Menu parent = this.menuService.getById(menu.getParentId());
                String parentName = parent.getName().trim();
                menu.setName(parentName + "-" + menu.getName().trim());
            }

            QueryWrapper<Menu> ew = new QueryWrapper<>();
            if (StringUtils.isNoneBlank(menu.getName())) {
                menu.setName(menu.getName().trim());
                ew.eq("menu_name", menu.getName());
                Menu one = this.menuService.getOne(ew);
                if (one != null) {
                    resultMap.put("status", "400");
                    resultMap.put("message", "菜单名称已存在!");
                    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                            resultMap);
                }
            }
            if (StringUtils.isNoneBlank(menu.getUrl())) {
                ew = new QueryWrapper<>();
                ew.eq("menu_url", menu.getUrl());
                Menu one = this.menuService.getOne(ew);
                if (one != null) {
                    resultMap.put("status", "400");
                    resultMap.put("message", "Url已存在!");
                    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                            resultMap);
                }
            }
            if (menu.getSort() != null) {
                ew = new QueryWrapper<>();
                ew.eq("sort", menu.getSort());
                ew.eq("is_deleted", 0);
                Menu one = this.menuService.getOne(ew);
                if (one != null) {
                    resultMap.put("status", "400");
                    resultMap.put("message", "顺序号已存在!");
                    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                            resultMap);
                }
            }

            menu.setCreateTime(new Date(System.currentTimeMillis()));
            menu.setUpdateTime(menu.getCreateTime());
            ret = this.menuService.save(menu);
            if (!ret) {
                // 更新失败, 400
                resultMap.put("status", "400");
                resultMap.put("message", "添加失败!");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }
            // 204
            resultMap.put("status", "200");
            resultMap.put("message", "添加成功!");
            return ResponseEntity.ok(resultMap);
        } catch (Exception e) {
            logger.error("添加权限错误!", e);
        }
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    // 修改
    @OperationLog("编辑菜单")
    @ApiOperation(value = "修改")
    @RequestMapping(value = "/edit", method = RequestMethod.PUT)
    @RequiresAuthentication  //@RequiresPermissions("/menu/edit")
    public ResponseEntity<Map<String, Object>> edit(Menu menu) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            boolean ret = false;
            if (menu.getId() != null) {
                if (!menu.getParentId().equals("0")) {
                    Menu parent = this.menuService.getById(menu.getParentId());
                    String parentName = parent.getName();
                    menu.setName(parentName + "-" + menu.getName().trim());
                }
                QueryWrapper<Menu> ew = new QueryWrapper<>();
                if (StringUtils.isNoneBlank(menu.getName())) {
                    menu.setName(menu.getName().trim());
                    ew.ne("id", menu.getId());
                    ew.eq("menu_name", menu.getName());
                    Menu one = this.menuService.getOne(ew);
                    if (one != null) {
                        resultMap.put("status", "400");
                        resultMap.put("message", "菜单名称已存在!");
                        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                                resultMap);
                    }
                }
                if (StringUtils.isNoneBlank(menu.getUrl())) {
                    ew = new QueryWrapper<>();
                    ew.ne("id", menu.getId());
                    ew.eq("menu_url", menu.getUrl());
                    Menu one = this.menuService.getOne(ew);
                    if (one != null) {
                        resultMap.put("status", "400");
                        resultMap.put("message", "Url已存在!");
                        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                                resultMap);
                    }
                }
                if (menu.getSort() != null) {
                    ew = new QueryWrapper<>();
                    ew.ne("id", menu.getId());
                    ew.eq("sort", menu.getSort());
                    ew.eq("is_deleted", 0);
                    Menu one = this.menuService.getOne(ew);
                    if (one != null) {
                        resultMap.put("status", "400");
                        resultMap.put("message", "顺序号已存在!");
                        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
                                resultMap);
                    }
                }
                ret = this.menuService.updateById(menu);
            } else {
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
            }
            if (!ret) {
                // 更新失败, 500
                resultMap.put("status", "500");
                resultMap.put("message", "更新错误!");
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
            }
            // 204
            resultMap.put("status", "200");
            resultMap.put("message", "更新成功!");
            return ResponseEntity.ok(resultMap);
        } catch (Exception e) {
            logger.error("编辑角色错误!", e);
        }
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    // 刪除
    @OperationLog("删除菜单")
    @ApiOperation(value = "刪除")
    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
    @RequiresAuthentication  //@RequiresPermissions("/menu/delete")
    public ResponseEntity<Map<String, Object>> delete(@RequestParam(value = "menuId", required = true) String menuId) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            boolean ret = false;
            if (StringUtils.isNotBlank(menuId)) {
                RoleMenu roleMenu = new RoleMenu();
                roleMenu.setMenuId(menuId);
                QueryWrapper<RoleMenu> ew = new QueryWrapper<RoleMenu>();
                ew.setEntity(roleMenu);
                List<RoleMenu> roleRightList = this.roleMenuService.list(ew);
                // 如果存在权限,先进行删除
                if (roleRightList.size() > 0) {
                    for (RoleMenu rm : roleRightList) {
                        this.roleMenuService.remove(new QueryWrapper<RoleMenu>(rm));
                    }
                }
                ret = this.menuService.removeById(menuId);
            } else {
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
            }
            if (!ret) {
                // 删除失败, 500
                resultMap.put("status", "500");
                resultMap.put("message", "删除失败!");
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
            }
            // 204
            resultMap.put("status", "200");
            resultMap.put("message", "删除成功!");
            return ResponseEntity.ok(resultMap);
        } catch (Exception e) {
            logger.error("删除菜单错误!", e);
        }
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    // 批量刪除
    @OperationLog("批量删除菜单")
    @ApiOperation(value = "批量刪除")
    @RequestMapping(value = "/batchDel", method = RequestMethod.DELETE)
    @RequiresAuthentication  //@RequiresPermissions("/menu/batchDel")
    public ResponseEntity<Map<String, Object>> batchDel(@RequestParam(value = "menuIds", required = true) String menuIds) {
        Map<String, Object> resultMap = new HashMap<>();
        try {
            boolean ret = false;
            if (StringUtils.isNotBlank(menuIds)) {
                QueryWrapper<RoleMenu> ew = new QueryWrapper<RoleMenu>();
                ew.in("menu_id", StringUtils.split(menuIds, ","));
                List<RoleMenu> roleRightList = this.roleMenuService.list(ew);
                // 如果存在权限,先进行删除
                if (roleRightList.size() > 0) {
                    for (RoleMenu rm : roleRightList) {
                        this.roleMenuService.remove(new QueryWrapper<RoleMenu>(rm));
                    }
                }

                ret = this.menuService.removeByIds(Arrays.asList(StringUtils.split(menuIds, ",")));
            } else {
                resultMap.put("status", "400");
                resultMap.put("message", "错误请求!");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }
            if (!ret) {
                // 删除失败, 500
                resultMap.put("status", "500");
                resultMap.put("message", "删除失败!");
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
            }
            // 204
            resultMap.put("status", "200");
            resultMap.put("message", "删除成功!");
            return ResponseEntity.ok(resultMap);
        } catch (Exception e) {
            logger.error("删除角色错误!", e);
        }
        // 500
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }

    @ApiOperation(value = "获取角色对应菜单列表--弹框树使用")
    @RequestMapping(value = "/getRoleMenu", method = RequestMethod.GET)
    @RequiresAuthentication  //@RequiresPermissions("/menu/getRoleMenu")
    public ResponseEntity<List<Map<String, String>>> getRoleMenu(String roleId) {
        try {
            QueryWrapper<Menu> menuWrapper = new QueryWrapper<>();
            menuWrapper.orderByAsc("sort");
            List<Menu> list = this.menuService.list(menuWrapper);
            List<Object> roleMenuList = null;
            if (roleId != null) {
                QueryWrapper<RoleMenu> wrapper = new QueryWrapper<>();
                wrapper.eq("role_id", roleId).select("menu_id");
                roleMenuList = this.roleMenuService.listObjs(wrapper);
            }

            List<Map<String, String>> menuList = new ArrayList<>();
            for (Menu m : list) {
                Map<String, String> map = new HashMap<>();
                map.put("id", m.getId());
                map.put("parentId", m.getParentId());
                map.put("menuName", m.getName());
                map.put("menuUrl", m.getUrl());
                map.put("sort", String.valueOf(m.getSort()));
                // 默认展开树
                map.put("open", "true");
                if (roleId != null) {
                    // 如果角色已有该菜单,则默认选中
                    if (roleMenuList.contains(m.getId())) {
                        map.put("checked", "true");
                    } else {
                        map.put("checked", "false");
                    }
                }
                menuList.add(map);
            }
            return ResponseEntity.ok(menuList);
        } catch (Exception e) {
            logger.error("获取该角色菜单失败", e.getMessage());
            e.printStackTrace();
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    /*@ApiOperation(value = "登录后获取当前用户的角色对应权限菜单列表")
    @RequestMapping(value = "/getUserMenuPerms", method = RequestMethod.GET)
    public ResponseEntity<List<Menu>> getUserMenuPerms(String roleId) {
        try {
            if (roleId != null) {
                List<Menu> menuList = this.menuService.getUserMenuPerms(roleId);
                return ResponseEntity.ok(menuList);
            }
        } catch (Exception e) {
            logger.error("获取该角色菜单失败", e.getMessage());
            e.printStackTrace();
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }*/
}