// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.buildertools.commands;

import java.util.Iterator;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
import com.hypixel.hytale.component.RemoveReason;
import java.util.function.Consumer;
import java.util.Objects;
import java.util.ArrayList;
import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.buildertools.PrototypePlayerBuilderToolSettings;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.protocol.GameMode;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;

public class ClearEntitiesCommand extends AbstractPlayerCommand
{
    @Nonnull
    private static final Message MESSAGE_NO_SELECTION;
    
    public ClearEntitiesCommand() {
        super("clearEntities", "server.commands.clearEntities.desc");
        this.setPermissionGroup(GameMode.Creative);
        this.requirePermission("hytale.editor.selection.clipboard");
    }
    
    @Override
    protected void execute(@Nonnull final CommandContext context, @Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> ref, @Nonnull final PlayerRef playerRef, @Nonnull final World world) {
        final Player playerComponent = store.getComponent(ref, Player.getComponentType());
        assert playerComponent != null;
        if (!PrototypePlayerBuilderToolSettings.isOkayToDoCommandsOnSelection(ref, playerComponent, store)) {
            return;
        }
        final BuilderToolsPlugin.BuilderState builderState = BuilderToolsPlugin.getState(playerComponent, playerRef);
        final BlockSelection selection = builderState.getSelection();
        if (selection == null) {
            context.sendMessage(ClearEntitiesCommand.MESSAGE_NO_SELECTION);
            return;
        }
        final Vector3i min = selection.getSelectionMin();
        final Vector3i max = selection.getSelectionMax();
        final int width = max.getX() - min.getX();
        final int height = max.getY() - min.getY();
        final int depth = max.getZ() - min.getZ();
        final ArrayList<Ref<EntityStore>> entitiesToRemove = new ArrayList<Ref<EntityStore>>();
        final int x = min.getX();
        final int y = min.getY();
        final int z = min.getZ();
        final int width2 = width;
        final int height2 = height;
        final int depth2 = depth;
        final ArrayList<Ref<EntityStore>> obj = entitiesToRemove;
        Objects.requireNonNull(obj);
        BuilderToolsPlugin.forEachCopyableInSelection(world, x, y, z, width2, height2, depth2, (Consumer<Ref<EntityStore>>)obj::add);
        final Store<EntityStore> entityStore = world.getEntityStore().getStore();
        for (final Ref<EntityStore> entityRef : entitiesToRemove) {
            entityStore.removeEntity(entityRef, RemoveReason.REMOVE);
        }
        context.sendMessage(Message.translation("server.commands.clearEntities.cleared").param("count", entitiesToRemove.size()));
    }
    
    static {
        MESSAGE_NO_SELECTION = Message.translation("server.commands.clearEntities.noSelection");
    }
}
