package com.simuwang.manage.api.system;

import com.simuwang.base.common.support.MybatisPage;
import com.simuwang.base.common.support.vo.OnlyIdNameVO;
import com.simuwang.base.pojo.dto.DeleteByIdsCmd;
import com.simuwang.base.pojo.dto.GetByIdQuery;
import com.simuwang.base.pojo.dto.UpdateStatusCmd;
import com.simuwang.base.pojo.dto.sys.RoleAddCmd;
import com.simuwang.base.pojo.dto.sys.RoleEditCmd;
import com.simuwang.base.pojo.dto.sys.RoleMenuAssignCmd;
import com.simuwang.base.pojo.dto.sys.RoleQuery;
import com.simuwang.base.pojo.vo.sys.SysRoleVO;
import com.simuwang.logging.SystemLog;
import com.simuwang.manage.service.system.SysRoleService;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理相关接口
 */
@SystemLog("角色管理")
@RestController
@RequestMapping("/v1/sys/role")
public class SysRoleController {
    private final SysRoleService service;

    public SysRoleController(SysRoleService service) {
        this.service = service;
    }

    /**
     * 分页接口
     *
     * @param query 角色列表分页请求参数
     * @return /
     */
    @SystemLog(value = "分页搜索", saveResult = true)
    @GetMapping("page")
    public MybatisPage<SysRoleVO> page(RoleQuery query) {
        return this.service.findPage(query);
    }

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

    /**
     * 更新角色
     *
     * @param command 角色id+角色信息
     */
    @SystemLog(value = "修改", type = SystemLog.Type.UPDATE)
    @PostMapping("update")
    public boolean update(@Valid @RequestBody RoleEditCmd 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 DeleteByIdsCmd command) {
        this.service.delete(command);
        return true;
    }

    /**
     * 给角色分配权限
     *
     * @param command 角色id对象
     */
    @SystemLog(value = "分配权限", type = SystemLog.Type.INSERT)
    @PostMapping("assign-perms")
    public boolean assignPermissions(@Valid @RequestBody RoleMenuAssignCmd command) {
        this.service.assignPerms(command);
        return true;
    }

    /**
     * 获取角色分配的权限
     *
     * @param query 角色id对象
     */
    @GetMapping("list-assign-perms")
    public List<OnlyIdNameVO> listAssignPerms(@Valid GetByIdQuery query) {
        return this.service.getRolePerms(query);
    }
}
