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

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

import javax.annotation.Nullable;
import com.hypixel.hytale.server.worldgen.loader.prefab.WeightedPrefabMapJsonLoader;
import com.hypixel.hytale.server.worldgen.loader.WorldGenPrefabSupplier;
import com.hypixel.hytale.common.map.IWeightedMap;
import com.hypixel.hytale.server.worldgen.loader.prefab.unique.UniquePrefabConfigurationJsonLoader;
import com.hypixel.hytale.server.worldgen.prefab.unique.UniquePrefabConfiguration;
import java.util.logging.Level;
import com.hypixel.hytale.server.worldgen.util.LogUtil;
import com.hypixel.hytale.server.worldgen.loader.context.FileLoadingContext;
import com.hypixel.hytale.server.worldgen.prefab.PrefabCategory;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.json.SeedString;
import com.hypixel.hytale.server.worldgen.loader.context.ZoneFileContext;
import com.hypixel.hytale.server.worldgen.prefab.unique.UniquePrefabGenerator;
import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
import com.hypixel.hytale.server.worldgen.SeedStringResource;
import com.hypixel.hytale.procedurallib.json.JsonLoader;

public class UniquePrefabContainerJsonLoader extends JsonLoader<SeedStringResource, UniquePrefabContainer>
{
    public static final UniquePrefabGenerator[] EMPTY_GENERATORS;
    protected final ZoneFileContext zoneContext;
    
    public UniquePrefabContainerJsonLoader(@Nonnull final SeedString<SeedStringResource> seed, final Path dataFolder, final JsonElement json, final ZoneFileContext zoneContext) {
        super(seed.append(".UniquePrefabContainer"), dataFolder, json);
        this.zoneContext = zoneContext;
    }
    
    @Nonnull
    @Override
    public UniquePrefabContainer load() {
        UniquePrefabGenerator[] generators;
        if (this.json == null || this.json.isJsonNull()) {
            generators = UniquePrefabContainerJsonLoader.EMPTY_GENERATORS;
        }
        else {
            final JsonArray jsonArray = this.get("Entries").getAsJsonArray();
            generators = new UniquePrefabGenerator[jsonArray.size()];
            for (int i = 0; i < jsonArray.size(); ++i) {
                generators[i] = new UniquePrefabGeneratorJsonLoader((SeedString<SeedStringResource>)this.seed.append(String.format("-%s", i)), this.dataFolder, jsonArray.get(i), this.zoneContext).load();
            }
        }
        return new UniquePrefabContainer(this.seed.hashCode(), generators);
    }
    
    static {
        EMPTY_GENERATORS = new UniquePrefabGenerator[0];
    }
    
    protected static class UniquePrefabGeneratorJsonLoader extends JsonLoader<SeedStringResource, UniquePrefabGenerator>
    {
        protected final ZoneFileContext zoneContext;
        
        public UniquePrefabGeneratorJsonLoader(@Nonnull final SeedString<SeedStringResource> seed, final Path dataFolder, final JsonElement json, final ZoneFileContext zoneContext) {
            super(seed.append(".UniquePrefabGenerator"), dataFolder, json);
            this.zoneContext = zoneContext;
        }
        
        @Nonnull
        @Override
        public UniquePrefabGenerator load() {
            return new UniquePrefabGenerator(this.loadName(), this.loadCategory(), this.loadPrefabs(), this.loadConfiguration(), this.zoneContext.getId());
        }
        
        public String loadName() {
            String name = "NO_NAME_GIVEN";
            if (this.has("Name")) {
                name = this.get("Name").getAsString();
            }
            return name;
        }
        
        protected PrefabCategory loadCategory() {
            final String category = this.mustGetString("Category", "");
            if (category.isEmpty()) {
                return PrefabCategory.UNIQUE;
            }
            if (!this.zoneContext.getParentContext().getPrefabCategories().contains(category)) {
                LogUtil.getLogger().at(Level.WARNING).log("Could not find prefab category: %s, defaulting to None", category);
                return PrefabCategory.UNIQUE;
            }
            return this.zoneContext.getParentContext().getPrefabCategories().get(category);
        }
        
        @Nonnull
        public UniquePrefabConfiguration loadConfiguration() {
            return new UniquePrefabConfigurationJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.get("Config"), this.zoneContext).load();
        }
        
        @Nullable
        public IWeightedMap<WorldGenPrefabSupplier> loadPrefabs() {
            return new WeightedPrefabMapJsonLoader((SeedString<SeedStringResource>)this.seed, this.dataFolder, this.json, "Prefab", "Weights").load();
        }
    }
    
    public interface Constants
    {
        public static final String KEY_ENTRIES = "Entries";
        public static final String KEY_CONFIG = "Config";
        public static final String KEY_PREFAB = "Prefab";
        public static final String KEY_WEIGHTS = "Weights";
        public static final String KEY_ENTRY_NAME = "Name";
        public static final String NO_NAME = "NO_NAME_GIVEN";
        public static final String SEED_INDEX_SUFFIX = "-%s";
    }
}
