import glob
import json
import os
import fnmatch
import re
import itertools
import sys

def parse_iperf_run(data, skip=1, use=8):
    tp_pat = re.compile(r'\[ *\d*\] *([0-9\.]*)- *([0-9\.]*) sec.*Bytes *([0-9\.]*) ([GM])bits.*')
    tps_time = {}
    for hn in fnmatch.filter(data['sims'].keys(), 'host.client.*'):
        sim = data['sims'][hn]
        for l in sim['stdout']:
            m = tp_pat.match(l)
            if not m:
                continue

            time = int(float(m.group(1)))
            if time < skip:
                continue
            if time >= skip + use:
                continue

            if not time in tps_time:
                tps_time[time] = []

            if m.group(4) == 'G':
                tps_time[time].append(float(m.group(3)))
            elif m.group(4) == 'M':
                m_tps = float(m.group(3))/1000
                tps_time[time].append(m_tps)

    tps = []
    for t in sorted(tps_time.keys()):
        x = sum(tps_time[t])
        tps.append(x)


    if len(tps) == 0:
        return None
    return sum(tps) / len(tps)

def parse_iperf(basename, skip=1, use=8):
    runs = []
    for path in glob.glob(basename + '-*.json'):
        if path == basename + '-0.json':
            # skip checkpoints
            continue

        with open(path, 'r') as f:
            data = json.load(f)
        result = parse_iperf_run(data, skip, use)
        if result is not None:
            runs.append(result)

    if not runs:
        return {'avg': None, 'min': None, 'max': None}
    else:
        return {'avg': sum(runs) / len(runs), 'min': min(runs),
                'max': max(runs)}
    result = {}
