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

package com.hypixel.hytale.server.worldgen.loader.climate;

import com.hypixel.hytale.server.worldgen.climate.DirectGrid;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.JitterPointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.ConstantCellJitter;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.NormalPointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.PointEvaluator;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.cell.CellDistanceFunction;
import com.hypixel.hytale.procedurallib.logic.cell.GridCellDistanceFunction;
import javax.annotation.Nullable;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import com.hypixel.hytale.procedurallib.json.SeedString;
import com.hypixel.hytale.server.worldgen.climate.ClimateNoise;
import com.hypixel.hytale.procedurallib.json.JsonLoader;
import com.hypixel.hytale.procedurallib.json.SeedResource;

public class ClimateGridJsonLoader<K extends SeedResource> extends JsonLoader<K, ClimateNoise.Grid>
{
    public ClimateGridJsonLoader(final SeedString<K> seed, final Path dataFolder, @Nullable final JsonElement json) {
        super(seed, dataFolder, json);
    }
    
    @Nonnull
    @Override
    public ClimateNoise.Grid load() {
        if (this.json == null) {
            return Constants.DEFAULT_GRID;
        }
        return new ClimateNoise.Grid(this.loadSeed(), this.loadScale(), GridCellDistanceFunction.DISTANCE_FUNCTION, this.loadEvaluator());
    }
    
    protected int loadSeed() {
        int seedVal = this.seed.hashCode();
        if (this.has("Seed")) {
            final SeedString<?> overwritten = this.seed.appendToOriginal(this.get("Seed").getAsString());
            seedVal = overwritten.hashCode();
        }
        return seedVal;
    }
    
    protected double loadScale() {
        return this.mustGetNumber("Scale", Constants.DEFAULT_SCALE).doubleValue();
    }
    
    protected PointEvaluator loadEvaluator() {
        final PointEvaluator pointEvaluator = NormalPointEvaluator.EUCLIDEAN;
        final double jitter = this.mustGetNumber("Jitter", Constants.DEFAULT_JITTER).doubleValue();
        final ConstantCellJitter biomeJitter = new ConstantCellJitter(jitter, jitter, jitter);
        return new JitterPointEvaluator(pointEvaluator, biomeJitter);
    }
    
    public interface Constants
    {
        public static final String KEY_SEED = "Seed";
        public static final String KEY_SCALE = "Scale";
        public static final String KEY_JITTER = "Jitter";
        public static final Double DEFAULT_SCALE = 1.0;
        public static final Double DEFAULT_JITTER = 0.8;
        public static final ClimateNoise.Grid DEFAULT_GRID = new ClimateNoise.Grid(0, 1.0, DirectGrid.INSTANCE, NormalPointEvaluator.EUCLIDEAN);
    }
}
