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

package com.hypixel.hytale.server.npc.corecomponents.items.builders;

import com.hypixel.hytale.server.npc.asset.builder.Builder;
import com.hypixel.hytale.server.npc.asset.builder.Feature;
import com.hypixel.hytale.server.npc.asset.builder.validators.asset.ItemExistsValidator;
import java.util.EnumSet;
import com.hypixel.hytale.server.npc.asset.builder.validators.AssetValidator;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleValidator;
import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
import com.hypixel.hytale.server.npc.asset.builder.validators.DoubleSingleValidator;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.instructions.Action;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.asset.builder.holder.AssetArrayHolder;
import com.hypixel.hytale.server.npc.corecomponents.items.ActionPickUpItem;
import com.hypixel.hytale.server.npc.asset.builder.holder.EnumHolder;
import com.hypixel.hytale.server.npc.asset.builder.holder.DoubleHolder;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderActionWithDelay;

public class BuilderActionPickUpItem extends BuilderActionWithDelay
{
    protected final DoubleHolder range;
    protected final EnumHolder<ActionPickUpItem.StorageTarget> pickupTarget;
    protected AssetArrayHolder items;
    protected boolean hoover;
    
    public BuilderActionPickUpItem() {
        this.range = new DoubleHolder();
        this.pickupTarget = new EnumHolder<ActionPickUpItem.StorageTarget>();
        this.items = new AssetArrayHolder();
    }
    
    @Nonnull
    @Override
    public String getShortDescription() {
        return "Pick up an item";
    }
    
    @Nonnull
    @Override
    public String getLongDescription() {
        return "Pick up an item. In hoover mode, will match to the Item array. Otherwise, requires a target to be provided e.g. by a DroppedItemSensor";
    }
    
    @Nonnull
    @Override
    public Action build(@Nonnull final BuilderSupport builderSupport) {
        return new ActionPickUpItem(this, builderSupport);
    }
    
    @Nonnull
    @Override
    public BuilderActionPickUpItem readConfig(@Nonnull final JsonElement data) {
        this.getDouble(data, "Range", this.range, 1.0, DoubleSingleValidator.greater0(), BuilderDescriptorState.Stable, "The range the item will be picked up from", null);
        this.getEnum(data, "StorageTarget", this.pickupTarget, ActionPickUpItem.StorageTarget.class, ActionPickUpItem.StorageTarget.Hotbar, BuilderDescriptorState.Experimental, "Where to prioritise putting the item", null);
        this.getBoolean(data, "Hoover", s -> this.hoover = s, false, BuilderDescriptorState.Stable, "Suck up all items in range", "Suck up all items in range with optional cooldown. Can be filtered with a list of glob patterns. Ignored outside hoover mode");
        this.getAssetArray(data, "Items", this.items, null, 0, Integer.MAX_VALUE, ItemExistsValidator.withConfig(EnumSet.of(AssetValidator.Config.LIST_NULLABLE, AssetValidator.Config.LIST_CAN_BE_EMPTY, AssetValidator.Config.MATCHER)), BuilderDescriptorState.Stable, "A list of glob item patterns to match", "A list of glob item patterns to match for hoover mode. If omitted, will match any item. Ignored outside hoover mode");
        this.requireFeatureIf("Hoover", false, this.hoover, EnumSet.of(Feature.Drop));
        return this;
    }
    
    @Nonnull
    @Override
    public BuilderDescriptorState getBuilderDescriptorState() {
        return BuilderDescriptorState.Stable;
    }
    
    public String[] getItems(final BuilderSupport support) {
        return this.items.get(support.getExecutionContext());
    }
    
    public boolean getHoover() {
        return this.hoover;
    }
    
    public double getRange(@Nonnull final BuilderSupport support) {
        return this.range.get(support.getExecutionContext());
    }
    
    public ActionPickUpItem.StorageTarget getStorageTarget(@Nonnull final BuilderSupport support) {
        return this.pickupTarget.get(support.getExecutionContext());
    }
}
