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

package com.hypixel.hytale.server.worldgen.benchmark;

import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.CompletableFuture;
import javax.annotation.Nonnull;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ConcurrentHashMap;
import com.hypixel.hytale.server.core.universe.world.worldgen.IWorldGenBenchmark;

public class ChunkWorldgenBenchmark implements IWorldGenBenchmark
{
    @Nonnull
    private final ConcurrentHashMap<String, AtomicInteger> prefabCounts;
    @Nonnull
    private final ConcurrentHashMap<String, AtomicInteger> caveNodeCounts;
    private boolean enabled;
    
    public ChunkWorldgenBenchmark() {
        this.prefabCounts = new ConcurrentHashMap<String, AtomicInteger>();
        this.caveNodeCounts = new ConcurrentHashMap<String, AtomicInteger>();
        this.enabled = false;
    }
    
    @Override
    public void start() {
        this.enabled = true;
    }
    
    @Override
    public void stop() {
        this.enabled = false;
        this.prefabCounts.clear();
        this.caveNodeCounts.clear();
    }
    
    @Nonnull
    @Override
    public CompletableFuture<String> buildReport() {
        final SortedMap<String, Integer> map = new TreeMap<String, Integer>(String::compareToIgnoreCase);
        final StringBuilder sb = new StringBuilder();
        sb.append("Generated prefab counts: \n");
        this.prefabCounts.forEach((key, value) -> map.put(key, value.get()));
        map.forEach((key, value) -> sb.append(key).append('\t').append(value).append('\n'));
        sb.append('\n');
        map.clear();
        sb.append("Generated cave node counts: \n");
        this.caveNodeCounts.forEach((key, value) -> map.put(key, value.get()));
        map.forEach((key, value) -> sb.append(key).append('\t').append(value).append('\n'));
        sb.append('\n');
        map.clear();
        return CompletableFuture.completedFuture(sb.toString());
    }
    
    public boolean isEnabled() {
        return this.enabled;
    }
    
    public void registerPrefab(final String name) {
        this.prefabCounts.computeIfAbsent(name, i -> new AtomicInteger(0));
        this.prefabCounts.get(name).incrementAndGet();
    }
    
    public void registerCaveNode(final String name) {
        this.caveNodeCounts.computeIfAbsent(name, i -> new AtomicInteger(0));
        this.caveNodeCounts.get(name).incrementAndGet();
    }
}
