"""
Usage: mmc-python-version-c++.py <max_simulation_time>

Arguments
    max_simulation_time : maximum amout of time to run the simulation for.

Options
    -h          : displays this help file
"""
import time
import docopt
import random

arguments = docopt.docopt(__doc__)
max_simulation_time = float(arguments['<max_simulation_time>'])

t_start = time.time()

arrival_rate = 10.0
number_of_servers = 3
service_rate = 4.0
max_simulation_time = max_simulation_time
warmup = 100
num_trials = 20

def run_trial(seed,
              arrival_rate,
              service_rate,
              number_of_servers,
              max_simulation_time,
              warmup):
    random.seed(seed)
    records = []
    servers_end = [0 for server in range(number_of_servers)]
    arrival_date = 0.0
    while arrival_date < max_simulation_time:
        arrival_date += random.expovariate(arrival_rate)
        service_time = random.expovariate(service_rate)
        service_start_date = max(arrival_date, min(servers_end))
        service_end_date = service_start_date + service_time
        wait = service_start_date - arrival_date
        servers_end.append(service_end_date)
        servers_end = sorted(servers_end)[-number_of_servers:]
        records.append((arrival_date, wait))
    waits = [r[1] for r in records if r[0] > warmup]
    return sum(waits) / len(waits)

mean_waits = []
for seed in range(num_trials):
    mean_waits.append(
        run_trial(seed, arrival_rate, service_rate,
            number_of_servers, max_simulation_time, warmup))

average_waits = sum(mean_waits) / len(mean_waits)

t_end = time.time()
print(t_end - t_start)