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

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

import com.google.gson.JsonArray;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import com.google.gson.JsonParser;
import java.nio.file.Files;
import com.hypixel.hytale.server.worldgen.climate.UniqueClimateGenerator;
import com.hypixel.hytale.server.worldgen.climate.ClimateGraph;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.hypixel.hytale.server.worldgen.climate.ClimateNoise;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.random.CoordinateRandomizer;
import com.hypixel.hytale.procedurallib.json.CoordinateRandomizerJsonLoader;
import com.hypixel.hytale.procedurallib.random.ICoordinateRandomizer;
import javax.annotation.Nullable;
import java.nio.file.Path;
import com.hypixel.hytale.procedurallib.json.SeedString;
import com.hypixel.hytale.server.worldgen.climate.ClimateMaskProvider;
import com.hypixel.hytale.procedurallib.json.JsonLoader;
import com.hypixel.hytale.procedurallib.json.SeedResource;

public class ClimateMaskJsonLoader<K extends SeedResource> extends JsonLoader<K, ClimateMaskProvider>
{
    public ClimateMaskJsonLoader(final SeedString<K> seed, final Path dataFolder, final Path maskFile) {
        super(seed, dataFolder, loadMaskFileJson(maskFile));
    }
    
    @Nullable
    @Override
    public ClimateMaskProvider load() {
        return new ClimateMaskProvider(this.loadRandomizer(), this.loadClimateNoise(), this.loadClimateGraph(), this.loadUniqueClimateGenerator());
    }
    
    @Nonnull
    protected ICoordinateRandomizer loadRandomizer() {
        if (this.has("Randomizer")) {
            return new CoordinateRandomizerJsonLoader(this.seed, this.dataFolder, this.get("Randomizer")).load();
        }
        return CoordinateRandomizer.EMPTY_RANDOMIZER;
    }
    
    @Nonnull
    protected ClimateNoise loadClimateNoise() {
        return new ClimateNoiseJsonLoader(this.seed, this.dataFolder, this.mustGetObject("Noise", null)).load();
    }
    
    @Nonnull
    protected ClimateGraph loadClimateGraph() {
        return new ClimateGraphJsonLoader(this.seed, this.dataFolder, this.mustGetObject("Climate", null)).load();
    }
    
    @Nonnull
    protected UniqueClimateGenerator loadUniqueClimateGenerator() {
        return new UniqueClimateGeneratorJsonLoader(this.seed, this.dataFolder, this.mustGetArray("UniqueZones", Constants.DEFAULT_UNIQUE)).load();
    }
    
    protected static JsonElement loadMaskFileJson(final Path file) {
        try (final BufferedReader reader = Files.newBufferedReader(file)) {
            return JsonParser.parseReader(reader);
        }
        catch (final IOException e) {
            throw new Error("Failed to load Mask.json", e);
        }
    }
    
    public interface Constants
    {
        public static final String KEY_RANDOMIZER = "Randomizer";
        public static final String KEY_UNIQUE_ZONES = "UniqueZones";
        public static final JsonArray DEFAULT_UNIQUE = new JsonArray();
    }
}
