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

package com.hypixel.hytale.server.worldgen;

import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import java.util.logging.Level;
import com.hypixel.hytale.server.worldgen.util.LogUtil;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import com.hypixel.hytale.server.worldgen.prefab.PrefabStoreRoot;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Map;
import com.hypixel.hytale.server.worldgen.loader.WorldGenPrefabLoader;
import java.nio.file.Path;
import com.hypixel.hytale.server.worldgen.loader.prefab.BlockPlacementMaskRegistry;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.condition.IIntCondition;
import com.hypixel.hytale.server.worldgen.loader.util.FileMaskCache;
import com.hypixel.hytale.procedurallib.json.SeedResource;

public class SeedStringResource implements SeedResource
{
    @Nonnull
    protected final FileMaskCache<IIntCondition> biomeMaskRegistry;
    @Nonnull
    protected final BlockPlacementMaskRegistry blockMaskRegistry;
    @Nonnull
    protected Path dataFolder;
    @Nonnull
    protected WorldGenPrefabLoader loader;
    @Nonnull
    protected final Map<String, AtomicInteger> uniqueIds;
    
    public SeedStringResource(@Nonnull final PrefabStoreRoot prefabStore, @Nonnull final Path dataFolder) {
        this.dataFolder = dataFolder;
        this.loader = new WorldGenPrefabLoader(prefabStore, dataFolder);
        this.biomeMaskRegistry = new FileMaskCache<IIntCondition>();
        this.blockMaskRegistry = new BlockPlacementMaskRegistry();
        this.uniqueIds = new Object2ObjectOpenHashMap<String, AtomicInteger>();
    }
    
    @Nonnull
    public String getUniqueName(@Nonnull final String prefix) {
        return prefix + this.uniqueIds.computeIfAbsent(prefix, k -> new AtomicInteger(0)).getAndIncrement();
    }
    
    public WorldGenPrefabLoader getLoader() {
        return this.loader;
    }
    
    public void setPrefabStore(@Nonnull final PrefabStoreRoot prefabStore) {
        if (prefabStore != this.loader.getStore()) {
            LogUtil.getLogger().at(Level.INFO).log("Set prefab-store to: %s", prefabStore.name());
            this.loader = new WorldGenPrefabLoader(prefabStore, this.dataFolder);
        }
    }
    
    public void setDataFolder(@Nonnull final Path dataFolder) {
        if (!dataFolder.equals(this.dataFolder)) {
            LogUtil.getLogger().at(Level.INFO).log("Set data-folder to: %s", dataFolder);
            this.dataFolder = dataFolder;
            this.loader = new WorldGenPrefabLoader(this.loader.getStore(), dataFolder);
        }
    }
    
    @Nonnull
    @Override
    public ResultBuffer.Bounds2d localBounds2d() {
        return ChunkGenerator.getResource().bounds2d;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer2d localBuffer2d() {
        return ChunkGenerator.getResource().resultBuffer2d;
    }
    
    @Nonnull
    @Override
    public ResultBuffer.ResultBuffer3d localBuffer3d() {
        return ChunkGenerator.getResource().resultBuffer3d;
    }
    
    @Override
    public void writeSeedReport(final String seedReport) {
        LogUtil.getLogger().at(Level.FINE).log(seedReport);
    }
    
    @Nonnull
    public FileMaskCache<IIntCondition> getBiomeMaskRegistry() {
        return this.biomeMaskRegistry;
    }
    
    @Nonnull
    public BlockPlacementMaskRegistry getBlockMaskRegistry() {
        return this.blockMaskRegistry;
    }
}
