package cn.nianxx.thhotel.platform.access.service.impl;

import cn.nianxx.thhotel.platform.access.common.enums.PlatformPermissionCode;
import cn.nianxx.thhotel.platform.access.repository.PlatformAccessRepository;
import cn.nianxx.thhotel.platform.access.service.AccessControlService;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.springframework.stereotype.Service;

/**
 * 平台权限判断服务实现。第一版只基于内置权限码和角色权限关系。
 */
@Service
public class AccessControlServiceImpl implements AccessControlService {

    private final PlatformAccessRepository accessRepository;

    /**
     * 注入角色权限仓储，权限服务不直接依赖 MyBatis Mapper。
     */
    public AccessControlServiceImpl(PlatformAccessRepository accessRepository) {
        this.accessRepository = accessRepository;
    }

    /**
     * 查询当前用户权限码，并按内置枚举顺序输出，保证前后端响应稳定。
     */
    @Override
    public List<String> listPermissionCodes(Long userId, boolean superAdmin) {
        if (superAdmin) {
            return List.of(PlatformPermissionCode.values()).stream()
                    .map(Enum::name)
                    .toList();
        }
        Set<String> ownedCodes = new LinkedHashSet<>(accessRepository.listActivePermissionCodesByUserId(userId));
        return List.of(PlatformPermissionCode.values()).stream()
                .map(Enum::name)
                .filter(ownedCodes::contains)
                .toList();
    }

    /**
     * 判断用户是否拥有指定权限码，超级管理员默认拥有全部内置权限。
     */
    @Override
    public boolean hasPermission(Long userId, boolean superAdmin, String permissionCode) {
        if (permissionCode == null || permissionCode.isBlank()) {
            return false;
        }
        return listPermissionCodes(userId, superAdmin).contains(permissionCode);
    }
}
