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

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

import com.hypixel.hytale.procedurallib.condition.ICoordinateCondition;
import com.hypixel.hytale.procedurallib.condition.DefaultCoordinateCondition;
import com.hypixel.hytale.procedurallib.property.NoiseProperty;
import com.hypixel.hytale.common.map.IWeightedMap;
import javax.annotation.Nonnull;
import java.util.Arrays;

public class EnvironmentContainer
{
    protected final DefaultEnvironmentContainerEntry defaultEntry;
    protected final EnvironmentContainerEntry[] entries;
    
    public EnvironmentContainer(final DefaultEnvironmentContainerEntry defaultEntry, final EnvironmentContainerEntry[] entries) {
        this.defaultEntry = defaultEntry;
        this.entries = entries;
    }
    
    public int getEnvironmentAt(final int seed, final int x, final int z) {
        for (final EnvironmentContainerEntry entry : this.entries) {
            if (entry.shouldGenerate(seed, x, z)) {
                return entry.getEnvironmentAt(seed, x, z);
            }
        }
        return this.defaultEntry.getEnvironmentAt(seed, x, z);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "EnvironmentContainer{defaultEntry=" + String.valueOf(this.defaultEntry) + ", entries=" + Arrays.toString(this.entries);
    }
    
    public static class DefaultEnvironmentContainerEntry extends EnvironmentContainerEntry
    {
        public DefaultEnvironmentContainerEntry(final IWeightedMap<Integer> environmentMapping, final NoiseProperty valueNoise) {
            super(environmentMapping, valueNoise, DefaultCoordinateCondition.DEFAULT_TRUE);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "DefaultEnvironmentContainerEntry{environmentMapping=" + String.valueOf(this.environmentMapping) + ", valueNoise=" + String.valueOf(this.valueNoise) + ", mapCondition=" + String.valueOf(this.mapCondition);
        }
    }
    
    public static class EnvironmentContainerEntry
    {
        public static final EnvironmentContainerEntry[] EMPTY_ARRAY;
        protected final IWeightedMap<Integer> environmentMapping;
        protected final NoiseProperty valueNoise;
        protected final ICoordinateCondition mapCondition;
        
        public EnvironmentContainerEntry(final IWeightedMap<Integer> environmentMapping, final NoiseProperty valueNoise, final ICoordinateCondition mapCondition) {
            this.environmentMapping = environmentMapping;
            this.valueNoise = valueNoise;
            this.mapCondition = mapCondition;
        }
        
        public boolean shouldGenerate(final int seed, final int x, final int z) {
            return this.mapCondition.eval(seed, x, z);
        }
        
        public int getEnvironmentAt(final int seed, final int x, final int z) {
            return this.environmentMapping.get(seed, x, z, (iSeed, ix, iz, entry) -> entry.valueNoise.get(iSeed, ix, iz), this);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "EnvironmentContainerEntry{environmentMapping=" + String.valueOf(this.environmentMapping) + ", valueNoise=" + String.valueOf(this.valueNoise) + ", mapCondition=" + String.valueOf(this.mapCondition);
        }
        
        static {
            EMPTY_ARRAY = new EnvironmentContainerEntry[0];
        }
    }
}
