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

package com.hypixel.hytale.builtin.hytalegenerator.propdistributions;

import java.util.Iterator;
import java.util.Collection;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.hypixel.hytale.math.util.FastRandom;
import com.hypixel.hytale.builtin.hytalegenerator.props.Prop;
import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.SeedGenerator;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.datastructures.WeightedMap;

public class WeightedAssignments extends Assignments
{
    @Nonnull
    private final WeightedMap<Assignments> weightedDistributions;
    @Nonnull
    private final SeedGenerator seedGenerator;
    private final int runtime;
    private final double noneProbability;
    
    public WeightedAssignments(@Nonnull final WeightedMap<Assignments> props, final int seed, final double noneProbability, final int runtime) {
        this.weightedDistributions = new WeightedMap<Assignments>(props);
        this.runtime = runtime;
        this.seedGenerator = new SeedGenerator(seed);
        this.noneProbability = noneProbability;
    }
    
    @Override
    public Prop propAt(@Nonnull final Vector3d position, @Nonnull final WorkerIndexer.Id id, final double distanceTOBiomeEdge) {
        if (this.weightedDistributions.size() == 0) {
            return Prop.noProp();
        }
        final long x = (long)(position.x * 10000.0);
        final long y = (long)(position.y * 10000.0);
        final long z = (long)(position.z * 10000.0);
        final FastRandom rand = new FastRandom(this.seedGenerator.seedAt(x, y, z));
        if (rand.nextDouble() < this.noneProbability) {
            return Prop.noProp();
        }
        return this.weightedDistributions.pick(rand).propAt(position, id, distanceTOBiomeEdge);
    }
    
    @Override
    public int getRuntime() {
        return this.runtime;
    }
    
    @Nonnull
    @Override
    public List<Prop> getAllPossibleProps() {
        final ArrayList<Prop> list = new ArrayList<Prop>();
        for (final Assignments d : this.weightedDistributions.allElements()) {
            list.addAll(d.getAllPossibleProps());
        }
        return list;
    }
}
