package com.example.demo.controller;

import com.example.demo.model.ApiResult;
import com.example.demo.model.Role;
import com.example.demo.service.RoleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理控制器。
 * <p>提供角色创建、修改、删除、查询及权限分配接口。</p>
 */
@RestController
@RequestMapping("/api/role")
@Tag(name = "角色管理", description = "角色管理模块接口（需求标识：SRS-F-01-002）")
public class RoleController {

    private final RoleService roleService;

    public RoleController(RoleService roleService) {
        this.roleService = roleService;
    }

    /**
     * 新增角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     */
    @PostMapping("/add")
    @Operation(summary = "新增角色", description = "创建新的角色")
    public ApiResult<Role> add(@RequestBody Role role) {
        return ApiResult.success(roleService.addRole(role));
    }

    /**
     * 编辑角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     */
    @PutMapping("/edit")
    @Operation(summary = "编辑角色", description = "修改已有角色信息")
    public ApiResult<Role> edit(@RequestBody Role role) {
        return ApiResult.success(roleService.editRole(role));
    }

    /**
     * 删除角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     */
    @DeleteMapping("/delete/{id}")
    @Operation(summary = "删除角色", description = "根据ID删除角色")
    public ApiResult<Void> delete(@PathVariable Long id) {
        roleService.deleteRole(id);
        return ApiResult.success();
    }

    /**
     * 查询角色列表。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     */
    @GetMapping("/list")
    @Operation(summary = "查询角色列表", description = "返回所有角色")
    public ApiResult<List<Role>> list() {
        return ApiResult.success(roleService.listRoles());
    }

    /**
     * 分配权限。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     */
    @PutMapping("/permission")
    @Operation(summary = "分配权限", description = "为指定角色分配权限标识集合")
    public ApiResult<Void> assignPermission(@RequestParam Long roleId,
                                             @RequestBody List<String> permissionCodes) {
        roleService.assignPermissions(roleId, permissionCodes);
        return ApiResult.success();
    }
}
