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

package com.hypixel.hytale.procedurallib.json;

import com.hypixel.hytale.procedurallib.property.NoiseProperty;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
import com.hypixel.hytale.procedurallib.random.RotatedCoordinateRandomizer;
import com.hypixel.hytale.procedurallib.random.CoordinateRotator;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.random.CoordinateRandomizer;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import com.hypixel.hytale.procedurallib.random.ICoordinateRandomizer;

public class CoordinateRandomizerJsonLoader<K extends SeedResource> extends JsonLoader<K, ICoordinateRandomizer>
{
    public CoordinateRandomizerJsonLoader(final SeedString<K> seed, final Path dataFolder, final JsonElement json) {
        super(seed, dataFolder, json);
    }
    
    @Nonnull
    @Override
    public ICoordinateRandomizer load() {
        if (this.json == null || this.json.isJsonNull()) {
            return CoordinateRandomizer.EMPTY_RANDOMIZER;
        }
        return this.loadRandomizer();
    }
    
    @Nonnull
    protected ICoordinateRandomizer loadRandomizer() {
        ICoordinateRandomizer randomizer = new CoordinateRandomizer(this.loadGenerators(".X-Noise#%s"), this.loadGenerators(".Y-Noise#%s"), this.loadGenerators(".Z-Noise#%s"));
        if (this.has("Rotate")) {
            final CoordinateRotator rotation = new CoordinateRotatorJsonLoader(this.seed, this.dataFolder, this.get("Rotate")).load();
            if (rotation != CoordinateRotator.NONE) {
                randomizer = new RotatedCoordinateRandomizer(randomizer, rotation);
            }
        }
        return randomizer;
    }
    
    @Nonnull
    protected CoordinateRandomizer.AmplitudeNoiseProperty[] loadGenerators(@Nonnull final String seedSuffix) {
        final JsonArray array = this.get("Generators").getAsJsonArray();
        final CoordinateRandomizer.AmplitudeNoiseProperty[] generators = new CoordinateRandomizer.AmplitudeNoiseProperty[array.size()];
        for (int i = 0; i < array.size(); ++i) {
            final JsonObject object = array.get(i).getAsJsonObject();
            final NoiseProperty property = new NoisePropertyJsonLoader(this.seed.alternateOriginal(String.format(seedSuffix, i)), this.dataFolder, object).load();
            final double amplitude = object.get("Amplitude").getAsDouble();
            generators[i] = new CoordinateRandomizer.AmplitudeNoiseProperty(property, amplitude);
        }
        return generators;
    }
    
    public interface Constants
    {
        public static final String KEY_GENERATORS = "Generators";
        public static final String KEY_GENERATORS_AMPLITUDE = "Amplitude";
        public static final String SEED_X_NOISE_SUFFIX = ".X-Noise#%s";
        public static final String SEED_Y_NOISE_SUFFIX = ".Y-Noise#%s";
        public static final String SEED_Z_NOISE_SUFFIX = ".Z-Noise#%s";
    }
}
