import os
import random
import sys
import string

MAX_KIDS = 100
MAX_LEN = 100

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, '%02d' % 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(verse, kids, short_desc=None, long_desc=None, shuffle_adj_list=True):
    n = len(kids)
    verse = ' '.join(verse)
    assert 1 <= n <= MAX_KIDS
    assert 1 <= len(verse) <= MAX_LEN
    sys.stderr.write('save case n=%d\n' % n)
    f = next_file(short_desc, long_desc)
    f.write('%s\n%d\n' % (verse, n))
    f.write('%s\n' % '\n'.join(kids))
    f.close()

def rand_word(L):
    return ''.join(random.choice(string.lowercase+string.uppercase) for _ in range(L))

def random_verse(words, full_len=False):
    acc_len = [0] + sorted(random.sample(range(1, MAX_LEN-words+2), words))
    if full_len: acc_len[-1] = MAX_LEN-words+1
    return [rand_word(x-y) for (x, y) in zip(acc_len[1::], acc_len)]

def random_case(verse_words, kids):
    verse = random_verse(verse_words)
    kids = [rand_word(random.randint(1, MAX_LEN)) for _ in range(kids)]
    save_case(verse, kids, short_desc='random')


def main():
    random.seed(13)

    save_case(['a'], ['b'], short_desc='single')
    save_case(['a', 'b', 'c'], ['a', 'b', 'c'], short_desc='three')

    max_kids = lambda: [rand_word(MAX_LEN) for _ in range(MAX_KIDS)]
    save_case(random_verse(MAX_LEN/2, True), max_kids(), short_desc='max_long_verse')
    save_case(random_verse(5, True), max_kids(), short_desc='max_medium_verse')
    save_case(random_verse(1, True), max_kids(), short_desc='max_short_verse')

    max_kids = lambda: [rand_word(MAX_LEN) for _ in range(MAX_KIDS-1)]
    save_case(random_verse(MAX_LEN/2, True), max_kids(), short_desc='maxodd_long_verse')
    save_case(random_verse(5, True), max_kids(), short_desc='maxodd_medium_verse')
    save_case(random_verse(1, True), max_kids(), short_desc='maxodd_short_verse')

    save_case(random_verse(MAX_LEN/2, True), [rand_word(MAX_LEN)], 'one_kid_long_verse')
    save_case(random_verse(2, True), [rand_word(MAX_LEN)], 'one_kid_short_verse')

    for _ in range(15):
        w = random.randint(1, MAX_LEN/2)
        n = random.randint(1, MAX_KIDS)
        random_case(w, n)

if __name__=='__main__':
    main()
