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

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

import com.hypixel.hytale.math.util.MathUtil;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.logic.ResultBuffer;

public class BorderPointEvaluator implements PointEvaluator
{
    public static final BorderPointEvaluator INSTANCE;
    
    @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) {
        if (isOrigin(cellX, cellY, buffer)) {
            return;
        }
        final double distance = getBorderDistance(x, y, buffer.x2, buffer.y2, cellPointX, cellPointY);
        if (distance < buffer.distance) {
            buffer.distance = distance;
        }
    }
    
    @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) {
        if (isOrigin(cellX, cellY, buffer)) {
            return;
        }
        final double distance = getBorderDistance(x, y, buffer.x2, buffer.y2, cellPointX, cellPointY);
        if (distance < buffer.distance) {
            buffer.distance2 = buffer.distance;
            buffer.distance = distance;
        }
        else if (distance < buffer.distance2) {
            buffer.distance2 = distance;
        }
    }
    
    @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) {
        throw new UnsupportedOperationException();
    }
    
    @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) {
        throw new UnsupportedOperationException();
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "BorderPointEvaluator{}";
    }
    
    protected static boolean isOrigin(final int cellX, final int cellY, @Nonnull final ResultBuffer.ResultBuffer2d buffer) {
        return cellX == buffer.ix2 && cellY == buffer.iy2;
    }
    
    protected static double getBorderDistance(final double x, final double y, final double originX, final double originY, final double cellPointX, final double cellPointY) {
        final double ax = (cellPointX + originX) * 0.5;
        final double ay = (cellPointY + originY) * 0.5;
        final double normX = -(cellPointY - originY);
        final double normY = cellPointX - originX;
        final double bx = ax + normX;
        final double by = ay + normY;
        return MathUtil.distanceToInfLineSq(x, y, ax, ay, bx, by);
    }
    
    static {
        INSTANCE = new BorderPointEvaluator();
    }
}
