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

package com.hypixel.hytale.math.shape;

import com.hypixel.hytale.function.predicate.TriIntObjPredicate;
import com.hypixel.hytale.math.block.BlockSphereUtil;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.function.predicate.TriIntPredicate;
import javax.annotation.Nonnull;

public class Ellipsoid implements Shape
{
    public double radiusX;
    public double radiusY;
    public double radiusZ;
    
    public Ellipsoid() {
    }
    
    public Ellipsoid(final double radius) {
        this(radius, radius, radius);
    }
    
    public Ellipsoid(final double radiusX, final double radiusY, final double radiusZ) {
        this.radiusX = radiusX;
        this.radiusY = radiusY;
        this.radiusZ = radiusZ;
    }
    
    @Nonnull
    public Ellipsoid assign(final double radius) {
        this.radiusX = radius;
        this.radiusY = radius;
        this.radiusZ = radius;
        return this;
    }
    
    @Nonnull
    @Override
    public Box getBox(final double x, final double y, final double z) {
        final Box boundingBox = new Box();
        boundingBox.min.assign(x - this.radiusX, y - this.radiusY, z - this.radiusZ);
        boundingBox.max.assign(x + this.radiusX, y + this.radiusY, z + this.radiusZ);
        return boundingBox;
    }
    
    @Override
    public boolean containsPosition(final double x, final double y, final double z) {
        final double xRatio = x / this.radiusX;
        final double yRatio = y / this.radiusY;
        final double zRatio = z / this.radiusZ;
        return xRatio * xRatio + yRatio * yRatio + zRatio * zRatio <= 1.0;
    }
    
    @Override
    public void expand(final double radius) {
        this.radiusX += radius;
        this.radiusY += radius;
        this.radiusZ += radius;
    }
    
    @Override
    public boolean forEachBlock(final double x, final double y, final double z, final double epsilon, @Nonnull final TriIntPredicate consumer) {
        return BlockSphereUtil.forEachBlock(MathUtil.floor(x), MathUtil.floor(y), MathUtil.floor(z), MathUtil.floor(this.radiusX + epsilon), MathUtil.floor(this.radiusY + epsilon), MathUtil.floor(this.radiusZ + epsilon), null, (_x, _y, _z, aVoid) -> consumer.test(_x, _y, _z));
    }
    
    @Override
    public <T> boolean forEachBlock(final double x, final double y, final double z, final double epsilon, final T t, @Nonnull final TriIntObjPredicate<T> consumer) {
        return BlockSphereUtil.forEachBlock(MathUtil.floor(x), MathUtil.floor(y), MathUtil.floor(z), MathUtil.floor(this.radiusX + epsilon), MathUtil.floor(this.radiusY + epsilon), MathUtil.floor(this.radiusZ + epsilon), t, consumer);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Ellipsoid{radiusX=" + this.radiusX + ", radiusY=" + this.radiusY + ", radiusZ=" + this.radiusZ;
    }
}
