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

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

import java.util.Objects;
import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
import java.util.function.BiFunction;
import com.google.gson.JsonElement;
import javax.annotation.Nullable;
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import javax.annotation.Nonnull;
import java.util.function.Function;
import java.util.Map;

public class BuilderObjectMapHelper<K, V> extends BuilderObjectArrayHelper<Map<K, V>, V>
{
    private Function<V, K> id;
    
    public BuilderObjectMapHelper(final Class classType, final Function<V, K> id, final BuilderContext owner) {
        super(classType, owner);
        this.id = id;
    }
    
    @Nullable
    @Override
    public Map<K, V> build(@Nonnull final BuilderSupport builderSupport) {
        if (this.hasNoElements()) {
            return null;
        }
        final Map<K, V> objects = new Object2ObjectLinkedOpenHashMap<K, V>();
        for (final BuilderObjectReferenceHelper<V> builderObjectReferenceHelper : this.builders) {
            if (!builderObjectReferenceHelper.excludeFromRegularBuild()) {
                final V value = builderObjectReferenceHelper.build(builderSupport);
                final K key = this.id.apply(value);
                if (objects.containsKey(key)) {
                    throw new IllegalArgumentException("Duplicate key \"" + String.valueOf(key) + "\" at " + this.getBreadCrumbs() + ": " + this.builderParameters.getFileName());
                }
                objects.put(key, value);
            }
        }
        return objects;
    }
    
    @Override
    public void readConfig(@Nonnull final JsonElement data, @Nonnull final BuilderManager builderManager, @Nonnull final BuilderParameters builderParameters, @Nonnull final BuilderValidationHelper builderValidationHelper) {
        super.readConfig(data, builderManager, builderParameters, builderValidationHelper);
    }
    
    @Nullable
    public <T, U> T testEach(@Nonnull final BiFunction<Builder<V>, U, T> test, @Nonnull final BuilderManager builderManager, final ExecutionContext executionContext, final U meta, final T successResult, final T emptyResult, final Builder<?> parentSpawnable) {
        if (this.hasNoElements()) {
            return emptyResult;
        }
        for (final BuilderObjectReferenceHelper<V> builderObjectReferenceHelper : this.builders) {
            final T result = test.apply(builderObjectReferenceHelper.getBuilder(builderManager, executionContext, parentSpawnable), meta);
            if (!Objects.equals(result, successResult)) {
                return result;
            }
        }
        return successResult;
    }
}
