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

package com.hypixel.hytale.procedurallib.json;

import com.hypixel.hytale.procedurallib.logic.GridNoise;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.NoiseFunction;

public class GridNoiseJsonLoader<K extends SeedResource> extends JsonLoader<K, NoiseFunction>
{
    public GridNoiseJsonLoader(@Nonnull final SeedString<K> seed, final Path dataFolder, final JsonElement json) {
        super(seed.append(".GridNoise"), dataFolder, json);
    }
    
    @Nonnull
    @Override
    public NoiseFunction load() {
        final double defaultThickness = this.loadDefaultThickness();
        return new GridNoise(this.loadThicknessX(defaultThickness), this.loadThicknessY(defaultThickness), this.loadThicknessZ(defaultThickness));
    }
    
    protected double loadDefaultThickness() {
        if (!this.has("Thickness")) {
            return Double.NaN;
        }
        return this.get("Thickness").getAsDouble();
    }
    
    protected double loadThicknessX(final double defaultThickness) {
        return this.loadThickness("ThicknessX", defaultThickness);
    }
    
    protected double loadThicknessY(final double defaultThickness) {
        return this.loadThickness("ThicknessY", defaultThickness);
    }
    
    protected double loadThicknessZ(double defaultThickness) {
        if (Double.isNaN(defaultThickness)) {
            defaultThickness = 0.0;
        }
        return this.loadThickness("ThicknessZ", defaultThickness);
    }
    
    protected double loadThickness(final String key, final double defaultThickness) {
        double value = defaultThickness;
        if (this.has(key)) {
            value = this.get(key).getAsDouble();
        }
        if (Double.isNaN(value)) {
            throw new Error(String.format("Could not find thickness '%s' and no default 'Thickness' value defined!", key));
        }
        return value;
    }
    
    public interface Constants
    {
        public static final double DEFAULT_NO_THICKNESS = Double.NaN;
        public static final double DEFAULT_THICKNESS_Z = 0.0;
        public static final String KEY_THICKNESS = "Thickness";
        public static final String KEY_THICKNESS_X = "ThicknessX";
        public static final String KEY_THICKNESS_Y = "ThicknessY";
        public static final String KEY_THICKNESS_Z = "ThicknessZ";
        public static final String ERROR_NO_THICKNESS = "Could not find thickness '%s' and no default 'Thickness' value defined!";
    }
}
