package net.minecraft.commands;

import net.minecraft.server.commands.PermissionCheck;

public interface PermissionSource {
    boolean hasPermission(int level);

    default boolean allowsSelectors() {
        return this.hasPermission(2);
    }

    // Paper start - Vanilla Command permission checking & expose restricted API
    interface RestrictedMarker { }

    public record Check<T extends PermissionSource>(@Override int requiredLevel, java.util.concurrent.atomic.AtomicReference<com.mojang.brigadier.tree.CommandNode<CommandSourceStack>> vanillaNode) implements PermissionCheck<T> {
        public Check(int requiredLevel) {
            this(requiredLevel, new java.util.concurrent.atomic.AtomicReference<>());
        }
    // Paper end - Vanilla Command permission checking & expose restricted API
        @Override
        public boolean test(T source) {
            // Paper start - Vanilla Command permission checking
            com.mojang.brigadier.tree.CommandNode<CommandSourceStack> currentCommand = vanillaNode.get();
            if (currentCommand != null && source instanceof CommandSourceStack commandSourceStack) {
                return commandSourceStack.hasPermission(this.requiredLevel, org.bukkit.craftbukkit.command.VanillaCommandWrapper.getPermission(currentCommand));
            }
            // Paper end - Vanilla Command permission checking
            return source.hasPermission(this.requiredLevel);
        }
    }
}
