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

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

import com.hypixel.hytale.procedurallib.logic.cell.DistanceCalculationMode;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
import com.hypixel.hytale.procedurallib.logic.cell.PointDistanceFunction;

public class NormalPointEvaluator implements PointEvaluator
{
    public static final PointEvaluator EUCLIDEAN;
    public static final PointEvaluator MANHATTAN;
    public static final PointEvaluator NATURAL;
    public static final PointEvaluator MAX;
    protected final PointDistanceFunction distanceFunction;
    
    public NormalPointEvaluator(final PointDistanceFunction distanceFunction) {
        this.distanceFunction = distanceFunction;
    }
    
    @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) {
        final double distance = this.distanceFunction.distance2D(seed, cellX, cellY, cellPointX, cellPointY, cellPointX - x, cellPointY - y);
        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) {
        final double distance = this.distanceFunction.distance2D(seed, cellX, cellY, cellPointX, cellPointY, cellPointX - x, cellPointY - y);
        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) {
        final double distance = this.distanceFunction.distance3D(seed, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, cellPointX - x, cellPointY - y, cellPointZ - z);
        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) {
        final double distance = this.distanceFunction.distance3D(seed, cellX, cellY, cellZ, cellPointX, cellPointY, cellPointZ, cellPointX - x, cellPointY - y, cellPointZ - z);
        buffer.register2(cellHash, cellX, cellY, cellZ, distance, cellPointX, cellPointY, cellPointZ);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "NormalPointEvaluator{distanceFunction=" + String.valueOf(this.distanceFunction);
    }
    
    public static PointEvaluator of(final PointDistanceFunction distanceFunction) {
        final DistanceCalculationMode mode = DistanceCalculationMode.from(distanceFunction);
        if (mode == null) {
            return new NormalPointEvaluator(distanceFunction);
        }
        return switch (mode) {
            default -> throw new MatchException(null, null);
            case EUCLIDEAN -> NormalPointEvaluator.EUCLIDEAN;
            case MANHATTAN -> NormalPointEvaluator.MANHATTAN;
            case NATURAL -> NormalPointEvaluator.NATURAL;
            case MAX -> NormalPointEvaluator.MAX;
        };
    }
    
    static {
        EUCLIDEAN = new NormalPointEvaluator(DistanceCalculationMode.EUCLIDEAN.getFunction());
        MANHATTAN = new NormalPointEvaluator(DistanceCalculationMode.MANHATTAN.getFunction());
        NATURAL = new NormalPointEvaluator(DistanceCalculationMode.NATURAL.getFunction());
        MAX = new NormalPointEvaluator(DistanceCalculationMode.MAX.getFunction());
    }
}
