package com.example.demo.controller;

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;
import java.util.Map;

/**
 * 角色管理控制器。
 * 提供角色增删改查和权限分配等 RESTful API 接口。
 */
@RestController
@RequestMapping("/api/role")
@Tag(name = "角色管理", description = "角色增删改查及权限分配接口（IMS-IF-ADMIN）")
public class RoleController {

    private final RoleService roleService;

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

    /**
     * 新增角色。
     *
     * @requirement(name="角色管理", id="SRS-IMS_F-002")
     *
     * @param role 角色信息
     * @return 创建后的角色
     */
    @PostMapping
    @Operation(summary = "新增角色", description = "创建新角色（非超级管理员）")
    public Role createRole(@RequestBody Role role) {
        return roleService.createRole(role);
    }

    /**
     * 编辑角色。
     *
     * @requirement(name="角色管理", id="SRS-IMS_F-002")
     *
     * @param id   角色ID
     * @param role 更新信息
     * @return 更新后的角色
     */
    @PutMapping("/{id}")
    @Operation(summary = "编辑角色", description = "根据ID更新角色信息")
    public Role updateRole(@PathVariable Long id, @RequestBody Role role) {
        return roleService.updateRole(id, role);
    }

    /**
     * 删除角色（超级管理员角色不可删除）。
     *
     * @requirement(name="角色管理", id="SRS-IMS_F-002")
     *
     * @param id 角色ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除角色", description = "根据ID删除角色（超级管理员角色不可删除）")
    public Map<String, Object> deleteRole(@PathVariable Long id) {
        roleService.deleteRole(id);
        return Map.of("message", "角色删除成功", "roleId", id);
    }

    /**
     * 查询角色列表。
     *
     * @requirement(name="角色管理", id="SRS-IMS_F-002")
     *
     * @param keyword 搜索关键字（可选）
     * @return 角色列表
     */
    @GetMapping
    @Operation(summary = "查询角色列表", description = "支持按角色名称搜索")
    public List<Role> listRoles(@RequestParam(required = false) String keyword) {
        return roleService.listRoles(keyword);
    }

    /**
     * 根据ID查询角色详情。
     *
     * @requirement(name="角色管理", id="SRS-IMS_F-002")
     *
     * @param id 角色ID
     * @return 角色详情
     */
    @GetMapping("/{id}")
    @Operation(summary = "查询角色详情", description = "根据ID获取角色详细信息（含权限列表）")
    public Role getRole(@PathVariable Long id) {
        return roleService.getRole(id);
    }

    /**
     * 分配角色权限（权限树分配）。
     *
     * @requirement(name="角色权限分配", id="SRS-IMS_F-006")
     * @requirement(name="菜单权限管理", id="SRS-IMS_F-007")
     * @requirement(name="按钮权限管理", id="SRS-IMS_F-008")
     * @requirement(name="数据权限分级管控", id="SRS-IMS_F-009")
     *
     * @param id          角色ID
     * @param permissions 权限标识列表
     * @return 更新后的角色
     */
    @PutMapping("/{id}/permissions")
    @Operation(summary = "分配角色权限", description = "为角色分配权限树（菜单/按钮/数据权限）")
    public Role assignPermissions(@PathVariable Long id, @RequestBody List<String> permissions) {
        return roleService.assignPermissions(id, permissions);
    }
}
