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

package com.hypixel.hytale.math.block;

import javax.annotation.Nonnull;
import com.hypixel.hytale.function.predicate.TriIntObjPredicate;
import javax.annotation.Nullable;

public class BlockTorusUtil
{
    public static <T> boolean forEachBlock(final int originX, final int originY, final int originZ, final int outerRadius, final int minorRadius, @Nullable final T t, @Nonnull final TriIntObjPredicate<T> consumer) {
        if (outerRadius <= 0) {
            throw new IllegalArgumentException(String.valueOf(outerRadius));
        }
        if (minorRadius <= 0) {
            throw new IllegalArgumentException(String.valueOf(minorRadius));
        }
        final int majorRadius = Math.max(1, outerRadius - minorRadius);
        final int sizeXZ = majorRadius + minorRadius;
        final float minorRadiusAdjusted = minorRadius + 0.41f;
        for (int x = -sizeXZ; x <= sizeXZ; ++x) {
            for (int z = -sizeXZ; z <= sizeXZ; ++z) {
                final double distFromCenter = Math.sqrt(x * x + z * z);
                final double distFromRing = distFromCenter - majorRadius;
                for (int y = -minorRadius; y <= minorRadius; ++y) {
                    final double distFromTube = Math.sqrt(distFromRing * distFromRing + y * y);
                    if (distFromTube <= minorRadiusAdjusted && !consumer.test(originX + x, originY + y, originZ + z, t)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    
    public static <T> boolean forEachBlock(final int originX, final int originY, final int originZ, final int outerRadius, final int minorRadius, final int thickness, final boolean capped, @Nullable final T t, @Nonnull final TriIntObjPredicate<T> consumer) {
        if (thickness < 1) {
            return forEachBlock(originX, originY, originZ, outerRadius, minorRadius, t, consumer);
        }
        if (outerRadius <= 0) {
            throw new IllegalArgumentException(String.valueOf(outerRadius));
        }
        if (minorRadius <= 0) {
            throw new IllegalArgumentException(String.valueOf(minorRadius));
        }
        final int majorRadius = Math.max(1, outerRadius - minorRadius);
        final int sizeXZ = majorRadius + minorRadius;
        final float minorRadiusAdjusted = minorRadius + 0.41f;
        final float innerMinorRadius = Math.max(0.0f, minorRadiusAdjusted - thickness);
        for (int x = -sizeXZ; x <= sizeXZ; ++x) {
            for (int z = -sizeXZ; z <= sizeXZ; ++z) {
                final double distFromCenter = Math.sqrt(x * x + z * z);
                final double distFromRing = distFromCenter - majorRadius;
                for (int y = -minorRadius; y <= minorRadius; ++y) {
                    final double distFromTube = Math.sqrt(distFromRing * distFromRing + y * y);
                    final boolean inOuter = distFromTube <= minorRadiusAdjusted;
                    if (inOuter) {
                        final boolean inInner = distFromTube < innerMinorRadius;
                        if (!inInner) {
                            if (!consumer.test(originX + x, originY + y, originZ + z, t)) {
                                return false;
                            }
                        }
                    }
                }
            }
        }
        return true;
    }
}
