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

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

import java.util.Iterator;
import com.hypixel.hytale.builtin.hytalegenerator.props.Prop;
import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer;
import com.hypixel.hytale.math.vector.Vector3d;
import java.util.Collection;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;

public class FieldFunctionAssignments extends Assignments
{
    @Nonnull
    private final Density density;
    @Nonnull
    private final List<FieldDelimiter> fieldDelimiters;
    private final int runtime;
    
    public FieldFunctionAssignments(@Nonnull final Density functionTree, @Nonnull final List<FieldDelimiter> fieldDelimiters, final int runtime) {
        this.runtime = runtime;
        this.density = functionTree;
        this.fieldDelimiters = new ArrayList<FieldDelimiter>(fieldDelimiters);
    }
    
    @Override
    public Prop propAt(@Nonnull final Vector3d position, @Nonnull final WorkerIndexer.Id id, final double distanceTOBiomeEdge) {
        if (this.fieldDelimiters.isEmpty()) {
            return Prop.noProp();
        }
        final Density.Context context = new Density.Context();
        context.position = position;
        context.workerId = id;
        context.distanceToBiomeEdge = distanceTOBiomeEdge;
        final double fieldValue = this.density.process(context);
        for (final FieldDelimiter fd : this.fieldDelimiters) {
            if (fd.isInside(fieldValue)) {
                return fd.assignments.propAt(position, id, distanceTOBiomeEdge);
            }
        }
        return Prop.noProp();
    }
    
    @Override
    public int getRuntime() {
        return this.runtime;
    }
    
    @Nonnull
    @Override
    public List<Prop> getAllPossibleProps() {
        final ArrayList<Prop> list = new ArrayList<Prop>();
        for (final FieldDelimiter f : this.fieldDelimiters) {
            list.addAll(f.assignments.getAllPossibleProps());
        }
        return list;
    }
    
    public static class FieldDelimiter
    {
        double top;
        double bottom;
        Assignments assignments;
        
        public FieldDelimiter(@Nonnull final Assignments propDistributions, final double bottom, final double top) {
            this.bottom = bottom;
            this.top = top;
            this.assignments = propDistributions;
        }
        
        boolean isInside(final double fieldValue) {
            return fieldValue < this.top && fieldValue >= this.bottom;
        }
    }
}
