// 
// 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 javax.annotation.Nonnull;
import java.util.List;

public class SandwichAssignments extends Assignments
{
    @Nonnull
    private final List<VerticalDelimiter> verticalDelimiters;
    private final int runtime;
    
    public SandwichAssignments(@Nonnull final List<VerticalDelimiter> verticalDelimiters, final int runtime) {
        this.runtime = runtime;
        this.verticalDelimiters = new ArrayList<VerticalDelimiter>(verticalDelimiters);
    }
    
    @Override
    public Prop propAt(@Nonnull final Vector3d position, @Nonnull final WorkerIndexer.Id id, final double distanceTOBiomeEdge) {
        if (this.verticalDelimiters.isEmpty()) {
            return Prop.noProp();
        }
        for (final VerticalDelimiter fd : this.verticalDelimiters) {
            if (fd.isInside(position.y)) {
                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 VerticalDelimiter f : this.verticalDelimiters) {
            list.addAll(f.assignments.getAllPossibleProps());
        }
        return list;
    }
    
    public static class VerticalDelimiter
    {
        double maxY;
        double minY;
        Assignments assignments;
        
        public VerticalDelimiter(@Nonnull final Assignments propDistributions, final double minY, final double maxY) {
            this.minY = minY;
            this.maxY = maxY;
            this.assignments = propDistributions;
        }
        
        boolean isInside(final double fieldValue) {
            return fieldValue < this.maxY && fieldValue >= this.minY;
        }
    }
}
