package com.example.demo.service;

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

import java.util.*;
import java.util.stream.Collectors;

/**
 * 权限管理服务。
 * <p>基于内存数据，提供基于角色的权限分配、菜单权限、按钮权限及数据权限管控。</p>
 */
@Service
public class PermissionService {

    private final Map<Long, Permission> permissionStore = new LinkedHashMap<>();

    public PermissionService() {
        initMockData();
    }

    private void initMockData() {
        // 菜单权限
        permissionStore.put(1L, new Permission(1L, "用户管理", "user:view", "menu", 0L));
        permissionStore.put(2L, new Permission(2L, "角色管理", "role:view", "menu", 0L));
        permissionStore.put(3L, new Permission(3L, "业务管理", "business:view", "menu", 0L));
        permissionStore.put(4L, new Permission(4L, "系统管理", "system:view", "menu", 0L));
        // 按钮权限
        permissionStore.put(5L, new Permission(5L, "新增用户", "user:add", "button", 1L));
        permissionStore.put(6L, new Permission(6L, "编辑用户", "user:edit", "button", 1L));
        permissionStore.put(7L, new Permission(7L, "删除用户", "user:delete", "button", 1L));
        permissionStore.put(8L, new Permission(8L, "新增角色", "role:add", "button", 2L));
        permissionStore.put(9L, new Permission(9L, "编辑角色", "role:edit", "button", 2L));
        permissionStore.put(10L, new Permission(10L, "提交业务", "business:submit", "button", 3L));
        permissionStore.put(11L, new Permission(11L, "审核业务", "business:review", "button", 3L));
    }

    /**
     * 为角色分配权限（通过角色服务委托实现）。
     *
     * @requirement(name="基于角色的权限分配", id="SRS-F-04-001")
     * @param roleId        角色ID
     * @param permissionIds 权限ID集合
     * @return 是否成功
     */
    public boolean assignToRole(Long roleId, Set<Long> permissionIds) {
        // 此方法简化处理，实际由 RoleService 维护关联
        // 此处仅做权限ID校验
        for (Long pid : permissionIds) {
            if (!permissionStore.containsKey(pid)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取菜单权限列表。
     *
     * @requirement(name="菜单权限", id="SRS-F-04-002")
     * @param roleIds 角色ID集合
     * @return 菜单权限列表
     */
    public List<Permission> getMenuPermissions(Set<Long> roleIds) {
        return permissionStore.values().stream()
                .filter(p -> "menu".equals(p.getType()))
                .collect(Collectors.toList());
    }

    /**
     * 获取按钮权限列表。
     *
     * @requirement(name="按钮权限", id="SRS-F-04-003")
     * @param roleIds 角色ID集合
     * @return 按钮权限列表
     */
    public List<Permission> getButtonPermissions(Set<Long> roleIds) {
        return permissionStore.values().stream()
                .filter(p -> "button".equals(p.getType()))
                .collect(Collectors.toList());
    }

    /**
     * 获取数据权限规则描述。
     *
     * @requirement(name="数据权限分级管控", id="SRS-F-04-004")
     * @param roleId 角色ID
     * @return 数据权限描述信息
     */
    public Map<String, Object> getDataPermission(Long roleId) {
        Map<String, Object> result = new LinkedHashMap<>();
        result.put("roleId", roleId);
        if (roleId != null && roleId == 1L) {
            result.put("ruleType", "全部");
            result.put("description", "管理员可查看全部数据");
        } else {
            result.put("ruleType", "部门");
            result.put("description", "普通用户仅可查看本部门数据");
        }
        return result;
    }

    /**
     * 获取所有权限列表。
     *
     * @return 权限列表
     */
    public List<Permission> findAll() {
        return new ArrayList<>(permissionStore.values());
    }
}
