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

package com.hypixel.hytale.server.spawning.world;

import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.server.spawning.SpawningPlugin;
import com.hypixel.hytale.server.spawning.util.ChunkColumnMask;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import com.hypixel.hytale.server.spawning.util.RandomChunkColumnIterator;
import it.unimi.dsi.fastutil.ints.IntSet;

public class ChunkEnvironmentSpawnData
{
    private IntSet possibleRoleTypes;
    private final IntSet unspawnableRoles;
    private boolean processedAsUnspawnable;
    private RandomChunkColumnIterator randomChunkColumnIterator;
    private int segmentCount;
    private double expectedNPCs;
    
    public ChunkEnvironmentSpawnData() {
        this.unspawnableRoles = new IntOpenHashSet();
    }
    
    public double getExpectedNPCs() {
        return this.expectedNPCs;
    }
    
    public RandomChunkColumnIterator getRandomChunkColumnIterator() {
        return this.randomChunkColumnIterator;
    }
    
    public void init(final int environmentIndex, @Nonnull final WorldChunk chunk) {
        this.randomChunkColumnIterator = new RandomChunkColumnIterator(new ChunkColumnMask(), chunk);
        this.possibleRoleTypes = SpawningPlugin.get().getRolesForEnvironment(environmentIndex);
        this.processedAsUnspawnable = false;
    }
    
    public void registerSegment(final int x, final int z) {
        this.randomChunkColumnIterator.getInitialPositions().set(x, z);
        ++this.segmentCount;
    }
    
    public int getSegmentCount() {
        return this.segmentCount;
    }
    
    public void updateDensity(final double density) {
        this.expectedNPCs = density * this.segmentCount / 1024.0;
    }
    
    public double getWeight(final double spawnedNPCs) {
        final double missingNPCs = this.expectedNPCs - spawnedNPCs;
        return MathUtil.maxValue(0.0, missingNPCs);
    }
    
    public boolean isFullyPopulated(final double spawnedNPCs) {
        return this.expectedNPCs <= spawnedNPCs;
    }
    
    public void markRoleAsUnspawnable(final int roleIndex) {
        this.unspawnableRoles.add(roleIndex);
    }
    
    public boolean isRoleSpawnable(final int roleIndex) {
        return !this.unspawnableRoles.contains(roleIndex);
    }
    
    public boolean allRolesUnspawnable() {
        return this.unspawnableRoles.size() >= this.possibleRoleTypes.size();
    }
    
    public boolean wasProcessedAsUnspawnable() {
        return this.processedAsUnspawnable;
    }
    
    public void markProcessedAsUnspawnable() {
        this.processedAsUnspawnable = true;
    }
}
