package basics.random;

import java.security.SecureRandom;
import java.util.Date;
import java.util.Random;
import basics.testing.Test;
import basics.utl.SUtl;

public class Generator
{
public static final SecureRandom randomizer = new SecureRandom();
private static final String      SIGNS_AZ19 = "abcdefhgkmnopqrstuvxyzabcdefhgkmnopqrstuvxyz123456789";

private Generator()
{
}

/**
 * a-z and 1-9
 * no space or special chars
 * @param len
 * @return string
 */
public static String createAZ19(int len)
{
   final StringBuilder randomString = new StringBuilder(len);
   for(int i = 0; i < len; i++)
      randomString.append(SIGNS_AZ19.charAt(randomizer.nextInt(SIGNS_AZ19.length())));
   return randomString.toString();
}

public static void unittest()
{
   int LEN = 10;
   String s1 = createAZ19(LEN);
   String s2 = createAZ19(LEN);
   Test.assertTrue(s1.length() == s2.length(), "Two random strings have different length.");
   Test.assertTrue(s1.length() == LEN, "Random strings have wrong length.");
   Test.assertEqualsFalse(s1, s2, "Two random strings are equal: " + s1);
}

/**
 * Creates a random double in the range between offset and offset+range. The randomizer must be
 * initialized. THe distance between the random values defined as step.
 */
public static synchronized double createRandomDouble(Random randomizer, double offset,
   double range, double step)
{
   double intRange = range / step;
   double intResult = (double)randomizer.nextInt((int)intRange);
   double dResult = (intResult * step) + offset;
   return dResult;
}

public static synchronized long createRandomNumber(int minLen, int maxLen)
{
   final String digits = "01234567890123456789";
   long init = new Date().getTime();
   Random r = new Random(init);
   int max = r.nextInt(maxLen - minLen) + minLen;
   StringBuilder a = new StringBuilder();
   int signs = digits.length() - 1;
   for(int i = 0; i < max; i++)
      a.append(digits.charAt(r.nextInt(signs)));
   return SUtl.toLong(a.toString(), 0);
}
}
