import os
import random
import sys
import math

MIN_INFECTED = 100
POPULATION = 10**7
MAX_INFECTED = POPULATION // 2


CASE = 1
DEST = os.path.join(os.getcwd(), '../data/secret')

def next_file(short_desc=None, long_desc=None):
    global CASE
    basename = os.path.join(DEST, '%03d' % CASE)
    CASE += 1
    if short_desc is not None:
        basename += '-' + short_desc
    if long_desc is not None:
        with open(basename+'.desc', 'w') as desc_out:
            desc_out.write(long_desc)
    return open(basename+'.in', 'w')

def save_case(infected, seed):
    assert MIN_INFECTED <= infected <= MAX_INFECTED
    sys.stderr.write('save case n=%d\n' % (infected))
    f = next_file(short_desc='%d' % infected)
    f.write('%d %d\n' % (infected, seed))
    f.close()

def rand_seed():
    return random.randint(0, 10**18)
    
def main():
    random.seed(13)

    MIN_LOG = math.log(MIN_INFECTED)
    MAX_LOG = math.log(MAX_INFECTED)
    
    for i in range(41):
        save_case(int(round(math.exp(MIN_LOG + i*(MAX_LOG-MIN_LOG)/40))), rand_seed())

    for i in range(5):
        save_case(2*MIN_INFECTED + i*MIN_INFECTED//2, rand_seed())

    for i in range(5):
        save_case(MAX_INFECTED//(2+i), rand_seed())

    # random cases at different scales
    hi = 10*MIN_INFECTED
    while hi <= MAX_INFECTED:
        hi_log = math.log(hi)
        for _ in range(10):
            infected = int(round(math.exp(random.uniform(MIN_LOG, hi_log))))
            save_case(infected, rand_seed())
        hi *= 10
            
    while CASE < 100: # add 99 secret cases in addition to the single sample case
        infected = int(round(math.exp(random.uniform(MIN_LOG, MAX_LOG))))
        save_case(infected, rand_seed())
    
    
if __name__=='__main__':
    main()
