#!/usr/bin/env python3
import random
from random import randint
import os
from os import system, path

random.seed(404)
os.chdir(path.join(path.dirname(__file__), '..'))

# Reference solution:
ref = "pypy submissions/accepted/jo.py"
CASE = 8

def gen_cases(subdir, generator, params):
    global CASE
    ddir = path.join("data", "secret", subdir)
    if not path.exists(ddir):
        os.makedirs(ddir)
    for p in params:
        infile = path.join(ddir, "%02d.in" % CASE)
        outfile = path.join(ddir, "%02d.ans" % CASE)
        CASE += 1
        print(infile)
        system(f"{generator} {' '.join(map(str, p))} > {infile}")
        system(f"{ref} < {infile} > {outfile}")

def param_sim_small():
    # Random n m r, m > n.
    seed = randint(0, 10**9)
    n = randint(2, 10)
    m = randint(n, 10)
    b = 10
    r = randint(0, 2000)
    max_wait = 5
    return (seed, n, m, b, r, max_wait)

def param_sim_1():
    # Random n m r, m < n.
    seed = randint(0, 10**9)
    n = randint(2, 1000)
    m = randint(1, n-1)
    b = 10**9
    r = randint(0, 2000)
    max_wait = 300
    return (seed, n, m, b, r, max_wait)

def param_sim_2():
    # Random n m r, m >= n.
    seed = randint(0, 10**9)
    n = randint(2, 1000)
    m = randint(n, 1000)
    b = 10**9
    r = randint(0, 2000)
    max_wait = 300
    return (seed, n, m, b, r, max_wait)

def param_sim_3():
    # Random n m r, m >= n.
    seed = randint(0, 10**9)
    n = randint(2, 1000)
    m = randint(n, 1000)
    b = 10**9
    r = randint(0, 10**6)
    max_wait = 300
    return (seed, n, m, b, r, max_wait)

def param_rand(magn):
    seed = randint(0, 10**9)
    n = randint(2, magn)
    m = randint(n, min(magn, n+1))
    t1 = random.choice(['random-no-ties', 'random-allow-ties'])
    return (seed, n, m, 'random', t1)
    

gen_cases("b_random_events", "./generators/random_events.py",
    [ (1, 10, 10, 1000, 1000, 5),
      (2, 10, 30, 500, 1000, 5) ] \
    + [ param_sim_small() for _ in range(10) ] \
    + [ param_sim_1() for _ in range(5) ] \
    + [ param_sim_2() for _ in range(10) ] \
    + [ param_sim_3() for _ in range(3) ] \
    + [ (23, 1000, 1000, 10**9-1, 10**6, 10**6) ]
)

gen_cases("c_two_events", "./generators/two_uniform.py",
    [ (1, 2, 2),
      (2, 3, 4), # n=m=3 is impossible
      (3, 5, 5),
      (4, 10, 10),
      (5, 50, 50),
      (6, 100, 100),
      (7, 200, 200),
      (8, 400, 400),
      (9, 500, 500),
      (10, 600, 600),
      (11, 750, 800),
      (12, 999, 1000) ])

gen_cases("d_random_preferences", "pypy generators/random_preferences.py",
          [ (4711, 999, 1000, 'random', 'random-no-ties'),
            (4712, 999, 1000, 'random', 'random-allow-ties'),
            (4713, 999, 999, 'all-same', 'all-same'),
            (4714, 999, 999, 'all-same', 'all-same-decreasing'),
            (4715, 999, 999, 'random', 'all-same-decreasing')
          ] +
          [ param_rand(100) for _ in range(5) ] +
          [ param_rand(500) for _ in range(5) ])
