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

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

import java.util.List;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer;
import com.hypixel.hytale.builtin.hytalegenerator.rangemaps.DoubleRange;
import com.hypixel.hytale.builtin.hytalegenerator.rangemaps.DoubleRangeMap;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;
import com.hypixel.hytale.builtin.hytalegenerator.framework.interfaces.functions.BiCarta;

public class SimpleNoiseCarta<T> extends BiCarta<T>
{
    @Nonnull
    private final Density density;
    @Nonnull
    private final DoubleRangeMap<T> rangeMap;
    private final T defaultValue;
    
    public SimpleNoiseCarta(@Nonnull final Density density, final T defaultValue) {
        this.density = density;
        this.defaultValue = defaultValue;
        this.rangeMap = new DoubleRangeMap<T>();
    }
    
    @Nonnull
    public SimpleNoiseCarta<T> put(@Nonnull final DoubleRange range, final T value) {
        this.rangeMap.put(range, value);
        return this;
    }
    
    @Override
    public T apply(final int x, final int z, @Nonnull final WorkerIndexer.Id id) {
        final Density.Context context = new Density.Context();
        context.position = new Vector3d(x, 0.0, z);
        context.workerId = id;
        final double noiseValue = this.density.process(context);
        final T value = this.rangeMap.get(noiseValue);
        return (value == null) ? this.defaultValue : value;
    }
    
    @Nonnull
    @Override
    public List<T> allPossibleValues() {
        final List<T> list = this.rangeMap.values();
        list.add(this.defaultValue);
        return list;
    }
}
