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

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

import com.hypixel.hytale.server.worldgen.loader.container.UniquePrefabContainerJsonLoader;
import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
import com.hypixel.hytale.server.worldgen.loader.cave.CaveGeneratorJsonLoader;
import com.hypixel.hytale.server.worldgen.cave.CaveGenerator;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.worldgen.biome.CustomBiome;
import com.hypixel.hytale.common.map.IWeightedMap;
import com.hypixel.hytale.server.worldgen.loader.biome.BiomePatternGeneratorJsonLoader;
import com.hypixel.hytale.server.worldgen.biome.Biome;
import com.hypixel.hytale.server.worldgen.biome.TileBiome;
import com.hypixel.hytale.server.worldgen.biome.BiomePatternGenerator;
import com.google.gson.JsonObject;
import com.hypixel.hytale.server.worldgen.zone.ZoneDiscoveryConfig;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import com.hypixel.hytale.procedurallib.json.SeedString;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.worldgen.loader.context.ZoneFileContext;
import com.hypixel.hytale.server.worldgen.zone.Zone;
import com.hypixel.hytale.server.worldgen.SeedStringResource;
import com.hypixel.hytale.procedurallib.json.JsonLoader;

public class ZoneJsonLoader extends JsonLoader<SeedStringResource, Zone>
{
    @Nonnull
    protected final ZoneFileContext zoneContext;
    
    public ZoneJsonLoader(@Nonnull final SeedString<SeedStringResource> seed, @Nonnull final Path dataFolder, @Nonnull final JsonElement json, @Nonnull final ZoneFileContext zoneContext) {
        super(seed.append(String.format(".Zone-%s", zoneContext.getName())), dataFolder, json);
        this.zoneContext = zoneContext;
    }
    
    @Nonnull
    @Override
    public Zone load() {
        return new Zone(this.zoneContext.getId(), this.zoneContext.getName(), this.loadDiscoveryConfig(), this.loadCaveGenerator(), this.loadBiomePatternGenerator(), this.loadUniquePrefabContainer());
    }
    
    @Nonnull
    protected ZoneDiscoveryConfig loadDiscoveryConfig() {
        final JsonElement discoveryElement = this.get("Discovery");
        if (discoveryElement == null || !discoveryElement.isJsonObject()) {
            return ZoneDiscoveryConfig.DEFAULT;
        }
        final JsonObject discoveryObject = discoveryElement.getAsJsonObject();
        Boolean display = null;
        final JsonElement displayElement = discoveryObject.get("Display");
        if (displayElement != null && !displayElement.isJsonNull()) {
            display = displayElement.getAsBoolean();
        }
        String zoneName = null;
        final JsonElement zoneNameElement = discoveryObject.get("ZoneName");
        if (zoneNameElement != null && !zoneNameElement.isJsonNull()) {
            zoneName = zoneNameElement.getAsString();
        }
        String soundEventId = null;
        final JsonElement soundElement = discoveryObject.get("SoundEventId");
        if (soundElement != null && !soundElement.isJsonNull()) {
            soundEventId = soundElement.getAsString();
        }
        String icon = null;
        final JsonElement iconElement = discoveryObject.get("Icon");
        if (iconElement != null && !iconElement.isJsonNull()) {
            icon = iconElement.getAsString();
        }
        Boolean major = null;
        final JsonElement majorElement = discoveryObject.get("Major");
        if (majorElement != null && !majorElement.isJsonNull()) {
            major = majorElement.getAsBoolean();
        }
        Float duration = null;
        final JsonElement durationElement = discoveryObject.get("Duration");
        if (durationElement != null && !durationElement.isJsonNull()) {
            duration = durationElement.getAsFloat();
        }
        Float fadeInDuration = null;
        final JsonElement fadeInElement = discoveryObject.get("FadeInDuration");
        if (fadeInElement != null && !fadeInElement.isJsonNull()) {
            fadeInDuration = fadeInElement.getAsFloat();
        }
        Float fadeOutDuration = null;
        final JsonElement fadeOutElement = discoveryObject.get("FadeOutDuration");
        if (fadeOutElement != null && !fadeOutElement.isJsonNull()) {
            fadeOutDuration = fadeOutElement.getAsFloat();
        }
        return ZoneDiscoveryConfig.of(display, zoneName, soundEventId, icon, major, duration, fadeInDuration, fadeOutDuration);
    }
    
    @Nonnull
    protected BiomePatternGenerator loadBiomePatternGenerator() {
        final IWeightedMap<TileBiome> tileBiomes = this.loadBiomes();
        final TileBiome[] biomes = tileBiomes.toArray();
        final CustomBiome[] customBiomes = this.loadCustomBiomes(biomes);
        try {
            return new BiomePatternGeneratorJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.get("BiomeGenerator"), tileBiomes, customBiomes).load();
        }
        catch (final Throwable e) {
            throw new Error("Error while loading biome generator.", e);
        }
    }
    
    @Nullable
    protected IWeightedMap<TileBiome> loadBiomes() {
        try {
            return new ZoneBiomesJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.get("BiomeGenerator"), this.zoneContext).load();
        }
        catch (final Throwable e) {
            throw new Error("Error while loading tile biomes.", e);
        }
    }
    
    @Nonnull
    protected CustomBiome[] loadCustomBiomes(@Nonnull final Biome[] tileBiomes) {
        try {
            return new ZoneCustomBiomesJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.get("BiomeGenerator"), this.zoneContext, tileBiomes).load();
        }
        catch (final Throwable e) {
            throw new Error("Error while loading custom biomes.", e);
        }
    }
    
    @Nullable
    protected CaveGenerator loadCaveGenerator() {
        try {
            return new CaveGeneratorJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.json, this.zoneContext.getPath().resolve("Cave"), this.zoneContext).load();
        }
        catch (final Throwable e) {
            throw new Error("Error while loading cave generator.", e);
        }
    }
    
    @Nonnull
    protected UniquePrefabContainer loadUniquePrefabContainer() {
        try {
            return new UniquePrefabContainerJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.get("UniquePrefabs"), this.zoneContext).load();
        }
        catch (final Throwable e) {
            throw new Error("Error while loading unique prefabs.", e);
        }
    }
    
    public interface Constants
    {
        public static final String KEY_BIOME_GENERATOR = "BiomeGenerator";
        public static final String KEY_UNIQUE_PREFABS = "UniquePrefabs";
        public static final String KEY_DISCOVERY = "Discovery";
        public static final String KEY_DISCOVERY_DISPLAY = "Display";
        public static final String KEY_DISCOVERY_ZONE = "ZoneName";
        public static final String KEY_DISCOVERY_SOUND_EVENT_ID = "SoundEventId";
        public static final String KEY_DISCOVERY_ICON = "Icon";
        public static final String KEY_DISCOVERY_MAJOR = "Major";
        public static final String KEY_DISCOVERY_DURATION = "Duration";
        public static final String KEY_DISCOVERY_FADE_IN_DURATION = "FadeInDuration";
        public static final String KEY_DISCOVERY_FADE_OUT_DURATION = "FadeOutDuration";
        public static final String PATH_CAVE = "Cave";
        public static final String SEED_ZONE_SUFFIX = ".Zone-%s";
        public static final String ERROR_BIOME_GENERATOR = "Error while loading biome generator.";
        public static final String ERROR_TILE_BIOMES = "Error while loading tile biomes.";
        public static final String ERROR_CUSTOM_BIOMES = "Error while loading custom biomes.";
        public static final String ERROR_CAVE_GENERATOR = "Error while loading cave generator.";
        public static final String ERROR_UNIQUE_PREFABS = "Error while loading unique prefabs.";
    }
}
