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

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

import com.hypixel.hytale.server.npc.asset.builder.Builder;
import java.util.List;
import com.hypixel.hytale.server.npc.util.expression.Scope;
import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import com.hypixel.hytale.server.npc.validators.NPCLoadTimeValidationHelper;
import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptorState;
import com.google.gson.JsonElement;
import com.hypixel.hytale.server.npc.corecomponents.utility.ActionSequence;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import com.hypixel.hytale.server.npc.asset.builder.BuilderContext;
import com.hypixel.hytale.server.npc.instructions.ActionList;
import com.hypixel.hytale.server.npc.asset.builder.BuilderObjectReferenceHelper;
import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderActionBase;

public class BuilderActionSequence extends BuilderActionBase
{
    protected final BuilderObjectReferenceHelper<ActionList> actions;
    protected boolean blocking;
    protected boolean atomic;
    
    public BuilderActionSequence() {
        this.actions = new BuilderObjectReferenceHelper<ActionList>(ActionList.class, this);
    }
    
    @Nonnull
    @Override
    public ActionSequence build(@Nonnull final BuilderSupport builderSupport) {
        return new ActionSequence(this, builderSupport);
    }
    
    @Nonnull
    @Override
    public BuilderActionSequence readConfig(@Nonnull final JsonElement data) {
        this.getBoolean(data, "Blocking", b -> this.blocking = b, false, BuilderDescriptorState.Stable, "Do not execute an action unless the previous action could execute", null);
        this.getBoolean(data, "Atomic", b -> this.atomic = b, false, BuilderDescriptorState.Stable, "Only execute actions if all actions can be executed", null);
        this.requireObject(data, "Actions", this.actions, BuilderDescriptorState.Stable, "List of actions", null, this.validationHelper);
        return this;
    }
    
    @Nonnull
    @Override
    public String getShortDescription() {
        return "List of actions.";
    }
    
    @Nonnull
    @Override
    public String getLongDescription() {
        return "Execute list of actions.";
    }
    
    @Nonnull
    @Override
    public BuilderDescriptorState getBuilderDescriptorState() {
        return BuilderDescriptorState.Stable;
    }
    
    @Override
    public boolean validate(final String configName, @Nonnull final NPCLoadTimeValidationHelper validationHelper, @Nonnull final ExecutionContext context, final Scope globalScope, @Nonnull final List<String> errors) {
        return super.validate(configName, validationHelper, context, globalScope, errors) & this.actions.validate(configName, validationHelper, this.builderManager, context, globalScope, errors);
    }
    
    @Nonnull
    public ActionList getActionList(@Nonnull final BuilderSupport builderSupport) {
        final ActionList actions = this.actions.build(builderSupport);
        if (actions != ActionList.EMPTY_ACTION_LIST) {
            actions.setAtomic(this.atomic);
            actions.setBlocking(this.blocking);
        }
        return actions;
    }
}
