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.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

/**
 * 角色管理控制器。
 * <p>提供角色的创建、修改、删除、查询及权限分配 RESTful API。</p>
 */
@Tag(name = "角色管理", description = "角色的创建、修改、删除、查询及权限分配")
@RestController
@RequestMapping("/api/role")
public class RoleController {

    private final RoleService roleService;

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

    /**
     * 新增角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * @param role 角色信息
     * @return 操作结果
     */
    @Operation(summary = "新增角色")
    @PostMapping("/add")
    public ApiResult<Role> add(@RequestBody Role role) {
        return ApiResult.success("新增成功", roleService.save(role));
    }

    /**
     * 编辑角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * @param role 角色信息
     * @return 操作结果
     */
    @Operation(summary = "编辑角色")
    @PutMapping("/edit")
    public ApiResult<Role> edit(@RequestBody Role role) {
        Role updated = roleService.update(role);
        if (updated == null) {
            return ApiResult.error(404, "角色不存在");
        }
        return ApiResult.success("编辑成功", updated);
    }

    /**
     * 删除角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * @param id 角色ID
     * @return 操作结果
     */
    @Operation(summary = "删除角色")
    @DeleteMapping("/delete/{id}")
    public ApiResult<Void> delete(@PathVariable Long id) {
        if (!roleService.deleteById(id)) {
            return ApiResult.error(404, "角色不存在");
        }
        return ApiResult.success("删除成功", null);
    }

    /**
     * 查询角色列表。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * @param roleName 角色名称（可选）
     * @return 角色列表
     */
    @Operation(summary = "查询角色列表")
    @GetMapping("/list")
    public ApiResult<List<Role>> list(
            @Parameter(description = "角色名称（模糊匹配）") @RequestParam(required = false) String roleName) {
        return ApiResult.success(roleService.list(roleName));
    }

    /**
     * 为角色分配权限。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * @param roleId        角色ID
     * @param permissionIds 权限ID集合
     * @return 操作结果
     */
    @Operation(summary = "分配权限")
    @PutMapping("/permission")
    public ApiResult<Void> assignPermission(
            @Parameter(description = "角色ID") @RequestParam Long roleId,
            @Parameter(description = "权限ID集合") @RequestBody Set<Long> permissionIds) {
        if (!roleService.assignPermissions(roleId, permissionIds)) {
            return ApiResult.error(404, "角色不存在");
        }
        return ApiResult.success("权限分配成功", null);
    }
}
