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

package com.hypixel.hytale.builtin.hytalegenerator.framework.math;

import javax.annotation.Nonnull;
import java.util.stream.IntStream;
import java.util.Random;

public class CoPrimeGenerator
{
    public static long[] generateCoPrimes(final long seed, final int bucketSize, final int numberOfBuckets, final long floor) {
        if (bucketSize < 1 || numberOfBuckets < 1) {
            throw new IllegalArgumentException("invalid sizes");
        }
        final Random rand = new Random(seed);
        final int[] primes = new int[bucketSize * numberOfBuckets];
        fillWithPrimes(primes);
        final int[][] buckets = new int[numberOfBuckets][bucketSize];
        final long[] output = new long[numberOfBuckets];
        int i = 0;
        IntStream.range(0, output.length).forEach(i -> output[i] = 1L);
        int indexOfBucket = 0;
        int indexOfPrime = 0;
        int indexInsideBucket = 0;
        while (indexOfPrime < primes.length) {
            buckets[indexOfBucket][indexInsideBucket] = primes[indexOfPrime];
            if (indexOfBucket == numberOfBuckets - 1) {
                ++indexInsideBucket;
            }
            indexOfBucket = (indexOfBucket + 1) % numberOfBuckets;
            ++indexOfPrime;
        }
        for (i = 0; i < numberOfBuckets; ++i) {
            while (output[i] < floor) {
                final long[] array = output;
                final int n = i;
                array[n] *= buckets[i][rand.nextInt(bucketSize)];
            }
        }
        return output;
    }
    
    public static void fillWithPrimes(@Nonnull final int[] bucket) {
        int number = 2;
        int index = 0;
        while (index < bucket.length) {
            if (isPrime(number)) {
                bucket[index] = number;
                ++index;
            }
            ++number;
        }
    }
    
    public static boolean isPrime(final int number) {
        for (int i = 2; i < number; ++i) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}
