package com.simuwang.manage.api.system;

import com.simuwang.base.common.support.MybatisPage;
import com.simuwang.base.pojo.dto.DeleteByIdCmd;
import com.simuwang.base.pojo.dto.UpdateStatusCmd;
import com.simuwang.base.pojo.dto.sys.MenuAddCmd;
import com.simuwang.base.pojo.dto.sys.MenuEditCmd;
import com.simuwang.base.pojo.dto.sys.MenuQuery;
import com.simuwang.base.pojo.dto.sys.MenuTreeQuery;
import com.simuwang.base.pojo.vo.sys.SysMenuVO;
import com.simuwang.logging.SystemLog;
import com.simuwang.manage.dto.MenuTreeDTO;
import com.simuwang.manage.service.system.SysMenuService;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 菜单管理相关接口
 */
@SystemLog(value = "菜单管理")
@RestController
@RequestMapping("/v1/sys/menu")
public class SysMenuController {
    private final SysMenuService service;

    public SysMenuController(SysMenuService service) {
        this.service = service;
    }

    /**
     * 分页接口
     *
     * @param query 菜单列表分页请求参数
     * @return /
     * @deprecated 菜单管理一般不分页展示，而是菜单树列表展示
     * @see #menuTrees(MenuTreeQuery)
     */
    @GetMapping("page")
    @Deprecated
    public MybatisPage<SysMenuVO> page(MenuQuery query) {
        return this.service.findPage(query);
    }

    /**
     * 菜单树列表
     *
     * @param query 查询条件
     * @return /
     */
    @SystemLog(value = "菜单树", saveResult = true)
    @GetMapping("tree")
    public List<MenuTreeDTO> menuTrees(MenuTreeQuery query) {
        return this.service.listMenuTrees(query);
    }

    /**
     * 新增菜单
     *
     * @param command 菜单信息
     */
    @SystemLog(value = "新增", type = SystemLog.Type.INSERT)
    @PostMapping("save")
    public boolean save(@Valid @RequestBody MenuAddCmd command) {
        this.service.insert(command);
        return true;
    }

    /**
     * 更新菜单
     *
     * @param command 菜单id+菜单信息
     */
    @SystemLog(value = "修改", type = SystemLog.Type.UPDATE)
    @PostMapping("update")
    public boolean update(@Valid @RequestBody MenuEditCmd command) {
        this.service.update(command);
        return true;
    }

    /**
     * 更新菜单状态接口
     *
     * @param command 菜单id+状态对象
     */
    @SystemLog(value = "更新状态", type = SystemLog.Type.UPDATE)
    @PostMapping("update-status")
    public boolean updateStatus(@Valid @RequestBody UpdateStatusCmd command) {
        this.service.updateStatus(command);
        return true;
    }

    /**
     * 根据id删除菜单信息接口
     *
     * @param command 菜单id对象
     */
    @SystemLog(value = "删除", type = SystemLog.Type.DELETE)
    @PostMapping("del")
    public boolean deleteById(@Valid @RequestBody DeleteByIdCmd command) {
        this.service.delete(command);
        return true;
    }
}
