// 
// 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.point.PointConsumer;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;
import com.hypixel.hytale.procedurallib.condition.IDoubleCondition;
import com.hypixel.hytale.procedurallib.condition.IIntCondition;

public class DensityPointEvaluator implements PointEvaluator
{
    protected final PointEvaluator pointEvaluator;
    protected final IIntCondition density;
    
    public DensityPointEvaluator(final PointEvaluator pointEvaluator, final IDoubleCondition density) {
        this(pointEvaluator, getDensityCondition(density));
    }
    
    public DensityPointEvaluator(final PointEvaluator pointEvaluator, final IIntCondition density) {
        this.pointEvaluator = pointEvaluator;
        this.density = density;
    }
    
    @Override
    public CellJitter getJitter() {
        return this.pointEvaluator.getJitter();
    }
    
    @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, final ResultBuffer.ResultBuffer2d buffer) {
        if (!this.density.eval(cellHash)) {
            return;
        }
        this.pointEvaluator.evalPoint(seed, x, y, cellHash, cellX, cellY, cellPointX, cellPointY, buffer);
    }
    
    @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, final ResultBuffer.ResultBuffer2d buffer) {
        if (!this.density.eval(cellHash)) {
            return;
        }
        this.pointEvaluator.evalPoint2(seed, x, y, cellHash, cellX, cellY, cellPointX, cellPointY, buffer);
    }
    
    @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, final ResultBuffer.ResultBuffer3d buffer) {
        if (!this.density.eval(cellHash)) {
            return;
        }
        this.pointEvaluator.evalPoint(seed, x, y, z, cellHash, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, buffer);
    }
    
    @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, final ResultBuffer.ResultBuffer3d buffer) {
        if (!this.density.eval(cellHash)) {
            return;
        }
        this.pointEvaluator.evalPoint2(seed, x, y, z, cellHash, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, buffer);
    }
    
    @Override
    public <T> void collectPoint(final int cellHash, final int cellX, final int cellY, final double x, final double y, final T t, @Nonnull final PointConsumer<T> consumer) {
        if (!this.density.eval(cellHash)) {
            return;
        }
        this.pointEvaluator.collectPoint(cellHash, cellX, cellY, x, y, t, consumer);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "DensityPointEvaluator{pointEvaluator=" + String.valueOf(this.pointEvaluator) + ", density=" + String.valueOf(this.density);
    }
    
    @Nonnull
    public static IIntCondition getDensityCondition(@Nullable final IDoubleCondition threshold) {
        if (threshold == null) {
            return seed -> true;
        }
        return seed -> threshold.eval(randomDensityCondition(seed));
    }
    
    public static double randomDensityCondition(final int seed) {
        return HashUtil.random(seed, -1694747730L);
    }
}
