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

package com.hypixel.hytale.server.npc.asset.builder;

import java.util.Iterator;
import java.util.Collections;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import java.util.function.BiConsumer;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.asset.builder.providerevaluators.ProviderEvaluator;
import java.util.List;

public class FeatureEvaluatorHelper
{
    @Nonnull
    private List<ProviderEvaluator> evaluators;
    private List<BiConsumer<BuilderManager, ExecutionContext>> providerReferenceValidators;
    private List<BiConsumer<FeatureEvaluatorHelper, ExecutionContext>> componentRequirementValidators;
    private boolean locked;
    private boolean containsProviderReference;
    private boolean isFeatureRequiringComponent;
    private boolean disallowParameterProviders;
    
    public FeatureEvaluatorHelper() {
        this.evaluators = new ObjectArrayList<ProviderEvaluator>();
    }
    
    public FeatureEvaluatorHelper(final boolean couldRequireFeature) {
        this.evaluators = new ObjectArrayList<ProviderEvaluator>();
        this.isFeatureRequiringComponent = couldRequireFeature;
    }
    
    public boolean isDisallowParameterProviders() {
        return this.disallowParameterProviders;
    }
    
    public void add(final ProviderEvaluator evaluator) {
        this.evaluators.add(evaluator);
    }
    
    public boolean canAddProvider() {
        return !this.locked;
    }
    
    @Nonnull
    public FeatureEvaluatorHelper lock() {
        this.locked = true;
        this.evaluators = Collections.unmodifiableList((List<? extends ProviderEvaluator>)this.evaluators);
        return this;
    }
    
    public void setContainsReference() {
        this.containsProviderReference = true;
    }
    
    public void addProviderReferenceValidator(final BiConsumer<BuilderManager, ExecutionContext> referenceValidator) {
        if (this.providerReferenceValidators == null) {
            this.providerReferenceValidators = new ObjectArrayList<BiConsumer<BuilderManager, ExecutionContext>>();
        }
        this.providerReferenceValidators.add(referenceValidator);
    }
    
    public void addComponentRequirementValidator(final BiConsumer<FeatureEvaluatorHelper, ExecutionContext> validator) {
        if (this.componentRequirementValidators == null) {
            this.componentRequirementValidators = new ObjectArrayList<BiConsumer<FeatureEvaluatorHelper, ExecutionContext>>();
        }
        this.componentRequirementValidators.add(validator);
    }
    
    @Nonnull
    public List<ProviderEvaluator> getProviders() {
        return this.evaluators;
    }
    
    public boolean requiresProviderReferenceEvaluation() {
        return this.containsProviderReference;
    }
    
    public boolean belongsToFeatureRequiringComponent() {
        return this.isFeatureRequiringComponent;
    }
    
    public void validateProviderReferences(final BuilderManager manager, final ExecutionContext context) {
        if (this.providerReferenceValidators == null) {
            return;
        }
        for (final BiConsumer<BuilderManager, ExecutionContext> validator : this.providerReferenceValidators) {
            validator.accept(manager, context);
        }
    }
    
    public void validateComponentRequirements(final FeatureEvaluatorHelper providers, final ExecutionContext context) {
        if (this.componentRequirementValidators == null) {
            return;
        }
        for (final BiConsumer<FeatureEvaluatorHelper, ExecutionContext> validator : this.componentRequirementValidators) {
            validator.accept(providers, context);
        }
    }
    
    public void disallowParameterProviders() {
        this.disallowParameterProviders = true;
    }
}
