// 
// 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.List;

public class TintContainer
{
    private final DefaultTintContainerEntry defaultEntry;
    private final List<TintContainerEntry> entries;
    
    public TintContainer(final DefaultTintContainerEntry defaultEntry, final List<TintContainerEntry> entries) {
        this.defaultEntry = defaultEntry;
        this.entries = entries;
    }
    
    public int getTintColorAt(final int seed, final int x, final int z) {
        for (int i = 0; i < this.entries.size(); ++i) {
            if (this.entries.get(i).shouldGenerate(seed, x, z)) {
                return this.entries.get(i).getTintColorAt(seed, x, z);
            }
        }
        return this.defaultEntry.getTintColorAt(seed, x, z);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "TintContainer{defaultEntry=" + String.valueOf(this.defaultEntry) + ", entries=" + String.valueOf(this.entries);
    }
    
    public static class DefaultTintContainerEntry extends TintContainerEntry
    {
        public DefaultTintContainerEntry(final IWeightedMap<Integer> colorMapping, final NoiseProperty valueNoise) {
            super(colorMapping, valueNoise, DefaultCoordinateCondition.DEFAULT_TRUE);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "DefaultTintContainerEntry{}";
        }
    }
    
    public static class TintContainerEntry
    {
        private final IWeightedMap<Integer> colorMapping;
        private final NoiseProperty valueNoise;
        private final ICoordinateCondition mapCondition;
        
        public TintContainerEntry(final IWeightedMap<Integer> colorMapping, final NoiseProperty valueNoise, final ICoordinateCondition mapCondition) {
            this.colorMapping = colorMapping;
            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 getTintColorAt(final int seed, final int x, final int z) {
            return this.colorMapping.get(seed, x, z, (iSeed, ix, iz, entry) -> entry.valueNoise.get(iSeed, ix, iz), this);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "TintContainerEntry{colorMapping=" + String.valueOf(this.colorMapping) + ", valueNoise=" + String.valueOf(this.valueNoise) + ", mapCondition=" + String.valueOf(this.mapCondition);
        }
    }
}
