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

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

import com.hypixel.hytale.server.worldgen.cave.CaveType;
import javax.annotation.Nullable;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.Reader;
import com.google.gson.stream.JsonReader;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import com.google.gson.JsonElement;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.json.SeedString;
import com.hypixel.hytale.server.worldgen.loader.context.ZoneFileContext;
import java.nio.file.Path;
import com.hypixel.hytale.server.worldgen.cave.CaveGenerator;
import com.hypixel.hytale.server.worldgen.SeedStringResource;
import com.hypixel.hytale.procedurallib.json.JsonLoader;

public class CaveGeneratorJsonLoader extends JsonLoader<SeedStringResource, CaveGenerator>
{
    protected final Path caveFolder;
    protected final ZoneFileContext zoneContext;
    
    public CaveGeneratorJsonLoader(@Nonnull final SeedString<SeedStringResource> seed, final Path dataFolder, final JsonElement json, final Path caveFolder, final ZoneFileContext zoneContext) {
        super(seed.append(".CaveGenerator"), dataFolder, json);
        this.caveFolder = caveFolder;
        this.zoneContext = zoneContext;
    }
    
    @Nullable
    @Override
    public CaveGenerator load() {
        CaveGenerator caveGenerator = null;
        if (this.caveFolder != null && Files.exists(this.caveFolder, new LinkOption[0])) {
            final Path file = this.caveFolder.resolve("Caves.json");
            try {
                JsonObject cavesJson;
                try (final JsonReader reader = new JsonReader(Files.newBufferedReader(file))) {
                    cavesJson = JsonParser.parseReader(reader).getAsJsonObject();
                }
                caveGenerator = new CaveGenerator(this.loadCaveTypes(cavesJson));
            }
            catch (final Throwable e) {
                throw new Error(String.format("Error while loading caves for world generator from %s", file.toString()), e);
            }
        }
        return caveGenerator;
    }
    
    @Nonnull
    protected CaveType[] loadCaveTypes(@Nonnull final JsonObject jsonObject) {
        return new CaveTypesJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, jsonObject.get("Types"), this.caveFolder, this.zoneContext).load();
    }
    
    public interface Constants
    {
        public static final String FILE_CAVES_JSON = "Caves.json";
        public static final String KEY_TYPES = "Types";
        public static final String ERROR_LOADING_CAVES = "Error while loading caves for world generator from %s";
    }
}
