package io.gisbi.application.system.controller;


import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import io.gisbi.application.system.domain.Menu;
import io.gisbi.application.system.service.IMenuService;
import io.gisbi.config.ResponseResult;
import io.gisbi.utils.AuthUtils;
import io.micrometer.common.util.StringUtils;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 菜单及按钮 前端控制器
 * </p>
 *
 * @author lilin
 * @since 2025-05-08
 */
@RestController
@RequestMapping("/menuInterface")
public class MenuController {

    @Resource
    private IMenuService menuService;

    /***********************************
     * 用途说明：新增菜单及按钮
     * 参数说明
     * sysMenu        菜单表对象
     * 返回值说明:   是否添加成功提示
     ***********************************/
    @PostMapping("/addMenu")
    @ResponseBody
    public ResponseResult addMenu(@RequestBody Menu menu) {
        boolean isOk = menuService.addMenu(menu);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /**
     * 上移/下移菜单
     */
    @PostMapping("/changeOrder")
    public ResponseResult changeOrder(@RequestParam String menuId, @RequestParam String direction) {
        boolean result = menuService.changeOrder(menuId, direction);
        if (result) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /**
     * 移动菜单到指定父级
     */
    @PostMapping("/moveMenu")
    public ResponseResult moveMenu(@RequestParam String menuId, @RequestParam String targetParentId) {
        boolean result = menuService.moveMenu(menuId, targetParentId);
        if (result) {
            return ResponseResult.success("移动成功");
        } else {
            return ResponseResult.error("移动失败");
        }
    }

    /***********************************
     * 用途说明：修改菜单及按钮根据ID
     * 参数说明
     * sysMenu        菜单或按钮表对象
     * 返回值说明:   是否修改成功提示
     ***********************************/
    @PostMapping("/updateMenuById")
    @ResponseBody
    public ResponseResult updateById(@RequestBody Menu menu) {
        if (StringUtils.isEmpty(menu.getId())) {
            return ResponseResult.error("没有菜单ID");
        }
        //填写 当前用户名称
        menu.setLastmodifier(AuthUtils.getUser().getUserId().toString());
        //填写 当前日期
        menu.setLastmodifydate(LocalDateTime.now());
        boolean isOk = menuService.updateById(menu);
        if (isOk) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }


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


    /***********************************
     * 用途说明：根据id查询菜单
     * 参数说明
     * id        菜单或按钮表id
     * 返回值说明:   菜单表对象
     ***********************************/
    @PostMapping("/getMenuById")
    @ResponseBody
    public ResponseResult getMenuById(String id) {
        Menu menu = menuService.getById(id);
        return ResponseResult.successData(menu);
    }



    /***********************************
     * 用途说明：根据id删除菜单或按钮
     * 参数说明
     * id        删除列的id
     * 返回值说明:   是否删除成功
     ***********************************/
    @PostMapping("/deleteMenuById")
    @ResponseBody
    public ResponseResult deleteMenuById(@RequestParam String id) {
        boolean ok = menuService.deleteMenuById(id);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

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

    /***********************************
     * 用途说明：更新关联模块ID
     * 参数说明
     * id          菜单及按钮表id
     * moduleId    关联模块ID
     * 返回值说明: 是否更新成功
     ***********************************/
    @PostMapping("/setModuleId")
    @ResponseBody
    public ResponseResult setModuleId(String id, String moduleId) {
        UpdateWrapper<Menu> updateWrapper = new UpdateWrapper<>();
        //根据id 修改关联模块ID ，最近修改人，最近修改时间
        updateWrapper.eq("id", id)
                .set("module_id", moduleId)
                .set("lastmodifier", AuthUtils.getUser().getUserId().toString())
                .set("lastmodifydate", new Timestamp(System.currentTimeMillis()));
        boolean ok = menuService.update(updateWrapper);
        if (ok) {
            return ResponseResult.success();
        } else {
            return ResponseResult.error();
        }
    }

    /***********************************
     * 用途说明：获取分配权限
     * 参数说明
     *  appId      系统id
     *  roleId     角色ID
     * 返回值说明:  菜单结构树集合
     ***********************************/
    @PostMapping("/permissionAssignment")
    @ResponseBody
    public List<Map<String, Object>> permissionAssignment(String appId, String roleId) {

        return menuService.permissionAssignment(appId,roleId);
    }
}
