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

package com.hypixel.hytale.builtin.portals.utils.posqueries.generators;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import com.hypixel.hytale.builtin.portals.utils.posqueries.SpatialQueryDebug;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.builtin.portals.utils.posqueries.SpatialQuery;

public class SearchCircular implements SpatialQuery
{
    private final double minRadius;
    private final double maxRadius;
    private final int attempts;
    
    public SearchCircular(final double radius, final int attempts) {
        this(radius, radius, attempts);
    }
    
    public SearchCircular(final double minRadius, final double maxRadius, final int attempts) {
        this.minRadius = minRadius;
        this.maxRadius = maxRadius;
        this.attempts = attempts;
    }
    
    @Override
    public Stream<Vector3d> createCandidates(final World world, final Vector3d origin, @Nullable final SpatialQueryDebug debug) {
        if (debug != null) {
            final String radiusFmt = (this.minRadius == this.maxRadius) ? String.format("%.1f", this.minRadius) : (String.format("%.1f", this.minRadius) + "-" + String.format("%.1f", this.maxRadius));
            debug.appendLine("Searching in a " + radiusFmt + " radius circle around " + debug.fmt(origin));
        }
        return Stream.generate(() -> {
            final ThreadLocalRandom rand = ThreadLocalRandom.current();
            final double rad = rand.nextDouble() * 3.141592653589793 * 2.0;
            final double radius = this.minRadius + rand.nextDouble() * (this.maxRadius - this.minRadius);
            return origin.clone().add(Math.cos(rad) * radius, 0.0, Math.sin(rad) * radius);
        }).limit(this.attempts);
    }
}
