package com.example.demo.service;

import com.example.demo.model.Role;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 角色管理服务。
 * <p>实现角色的创建、修改、删除、查询，并为角色分配权限。</p>
 */
@Service
public class RoleService {

    private final Map<Long, Role> roleMap = new ConcurrentHashMap<>();
    private final AtomicLong idCounter = new AtomicLong(1);

    public RoleService() {
        long r1 = idCounter.getAndIncrement();
        roleMap.put(r1, new Role(r1, "超级管理员", "SUPER_ADMIN", 1));
        long r2 = idCounter.getAndIncrement();
        roleMap.put(r2, new Role(r2, "普通用户", "USER", 1));
        long r3 = idCounter.getAndIncrement();
        roleMap.put(r3, new Role(r3, "审核员", "REVIEWER", 1));
    }

    /**
     * 创建角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * 创建新的角色并返回完整信息。
     */
    public Role addRole(Role role) {
        long id = idCounter.getAndIncrement();
        role.setId(id);
        if (role.getStatus() == null) {
            role.setStatus(1);
        }
        roleMap.put(id, role);
        return role;
    }

    /**
     * 修改角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * 修改已有角色的名称、编码或状态。
     */
    public Role editRole(Role role) {
        Role existing = roleMap.get(role.getId());
        if (existing == null) {
            throw new RuntimeException("角色不存在，id=" + role.getId());
        }
        if (role.getRoleName() != null) existing.setRoleName(role.getRoleName());
        if (role.getRoleCode() != null) existing.setRoleCode(role.getRoleCode());
        if (role.getStatus() != null) existing.setStatus(role.getStatus());
        return existing;
    }

    /**
     * 删除角色。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * 根据ID删除指定角色。
     */
    public void deleteRole(Long id) {
        if (!roleMap.containsKey(id)) {
            throw new RuntimeException("角色不存在，id=" + id);
        }
        roleMap.remove(id);
    }

    /**
     * 查询角色列表。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * 返回所有角色列表。
     */
    public List<Role> listRoles() {
        return new ArrayList<>(roleMap.values());
    }

    /**
     * 分配权限（预留扩展点：此处模拟关联关系）。
     *
     * @requirement(name="角色管理", id="SRS-F-01-002")
     * 为指定角色分配权限标识集合。
     */
    public void assignPermissions(Long roleId, List<String> permissionCodes) {
        if (!roleMap.containsKey(roleId)) {
            throw new RuntimeException("角色不存在，id=" + roleId);
        }
        // 当前用内存模拟，仅校验角色存在性
        // 后续可扩展为写入 role_permission 关联表
    }

    /**
     * 根据ID查询角色。
     */
    public Role getRoleById(Long id) {
        return roleMap.get(id);
    }
}
