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

package com.hypixel.hytale.procedurallib.logic.cell.evaluator;

import com.hypixel.hytale.math.util.HashUtil;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import com.hypixel.hytale.procedurallib.supplier.IDoubleRange;
import com.hypixel.hytale.procedurallib.supplier.ISeedDoubleRange;
import com.hypixel.hytale.procedurallib.logic.cell.PointDistanceFunction;

public class DistancePointEvaluator implements PointEvaluator
{
    protected final PointDistanceFunction distanceFunction;
    protected final ISeedDoubleRange distanceMod;
    
    public DistancePointEvaluator(final PointDistanceFunction distanceFunction, final IDoubleRange distanceMod) {
        this(distanceFunction, getDistanceModifier(distanceMod));
    }
    
    public DistancePointEvaluator(final PointDistanceFunction distanceFunction, final ISeedDoubleRange distanceMod) {
        this.distanceFunction = distanceFunction;
        this.distanceMod = distanceMod;
    }
    
    @Override
    public void evalPoint(final int seed, final double x, final double y, final int cellHash, final int cellX, final int cellY, final double cellPointX, final double cellPointY, @Nonnull final ResultBuffer.ResultBuffer2d buffer) {
        double distance = this.distanceFunction.distance2D(seed, cellX, cellY, cellPointX, cellPointY, cellPointX - x, cellPointY - y);
        distance = this.distanceMod.getValue(cellHash, distance);
        buffer.register(cellHash, cellX, cellY, distance, cellPointX, cellPointY);
    }
    
    @Override
    public void evalPoint2(final int seed, final double x, final double y, final int cellHash, final int cellX, final int cellY, final double cellPointX, final double cellPointY, @Nonnull final ResultBuffer.ResultBuffer2d buffer) {
        double distance = this.distanceFunction.distance2D(seed, cellX, cellY, cellPointX, cellPointY, cellPointX - x, cellPointY - y);
        distance = this.distanceMod.getValue(cellHash, distance);
        buffer.register2(cellHash, cellX, cellY, distance, cellPointX, cellPointY);
    }
    
    @Override
    public void evalPoint(final int seed, final double x, final double y, final double z, final int cellHash, final int cellX, final int cellY, final int cellZ, final double cellPointX, final double cellPointY, final double cellPointZ, @Nonnull final ResultBuffer.ResultBuffer3d buffer) {
        double distance = this.distanceFunction.distance3D(seed, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, cellPointX - x, cellPointY - y, cellPointZ - z);
        distance = this.distanceMod.getValue(cellHash, distance);
        buffer.register(cellHash, cellX, cellY, cellZ, distance, cellPointX, cellPointY, cellPointZ);
    }
    
    @Override
    public void evalPoint2(final int seed, final double x, final double y, final double z, final int cellHash, final int cellX, final int cellY, final int cellZ, final double cellPointX, final double cellPointY, final double cellPointZ, @Nonnull final ResultBuffer.ResultBuffer3d buffer) {
        double distance = this.distanceFunction.distance3D(seed, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, cellPointX - x, cellPointY - y, cellPointZ - z);
        distance = this.distanceMod.getValue(cellHash, distance);
        buffer.register2(cellHash, cellX, cellY, cellZ, distance, cellPointX, cellPointY, cellPointZ);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "DistancePointEvaluator{distanceFunction=" + String.valueOf(this.distanceFunction) + ", distanceMod=" + String.valueOf(this.distanceMod);
    }
    
    @Nonnull
    public static ISeedDoubleRange getDistanceModifier(@Nullable final IDoubleRange range) {
        if (range == null) {
            return ISeedDoubleRange.DIRECT;
        }
        return (seed, value) -> value * range.getValue(randomDistanceModification(seed));
    }
    
    public static double randomDistanceModification(final int seed) {
        return HashUtil.random(seed, 1495661265L);
    }
}
