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

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

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public enum DistanceCalculationMode
{
    EUCLIDEAN((PointDistanceFunction)new PointDistanceFunction() {
        @Override
        public double distance2D(final double deltaX, final double deltaY) {
            return deltaX * deltaX + deltaY * deltaY;
        }
        
        @Override
        public double distance3D(final double deltaX, final double deltaY, final double deltaZ) {
            return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "EuclideanPointDistanceFunction{}";
        }
    }), 
    MANHATTAN((PointDistanceFunction)new PointDistanceFunction() {
        @Override
        public double distance2D(final double deltaX, final double deltaY) {
            return Math.abs(deltaX) + Math.abs(deltaY);
        }
        
        @Override
        public double distance3D(final double deltaX, final double deltaY, final double deltaZ) {
            return Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaZ);
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "ManhattanPointDistanceFunction{}";
        }
    }), 
    NATURAL((PointDistanceFunction)new PointDistanceFunction() {
        @Override
        public double distance2D(final double deltaX, final double deltaY) {
            return Math.abs(deltaX) + Math.abs(deltaY) + deltaX * deltaX + deltaY * deltaY;
        }
        
        @Override
        public double distance3D(final double deltaX, final double deltaY, final double deltaZ) {
            return Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaZ) + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "NaturalPointDistanceFunction{}";
        }
    }), 
    MAX((PointDistanceFunction)new PointDistanceFunction() {
        @Override
        public double distance2D(final double deltaX, final double deltaY) {
            return Math.max(Math.abs(deltaX), Math.abs(deltaY));
        }
        
        @Override
        public double distance3D(final double deltaX, final double deltaY, final double deltaZ) {
            return Math.max(Math.abs(deltaX), Math.max(Math.abs(deltaY), Math.abs(deltaZ)));
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "MaxPointDistanceFunction{}";
        }
    });
    
    protected static final DistanceCalculationMode[] VALUES;
    private final PointDistanceFunction function;
    
    private DistanceCalculationMode(final PointDistanceFunction function) {
        this.function = function;
    }
    
    public PointDistanceFunction getFunction() {
        return this.function;
    }
    
    @Nullable
    public static DistanceCalculationMode from(final PointDistanceFunction function) {
        for (final DistanceCalculationMode mode : DistanceCalculationMode.VALUES) {
            if (mode.function == function) {
                return mode;
            }
        }
        return null;
    }
    
    static {
        VALUES = values();
    }
}
