import sys
from data_stat import med_dev, round_deviation, groupby_globally
from data_stat import read_data_agent_result


def key(x):
    return (x['__meta__']['blocksize'],
            'd' if x['__meta__']['direct_io'] else 's',
            x['__meta__']['action'],
            x['__meta__']['concurence'])


template = "{bs:>4}  {action:>12}  {cache_tp:>3}  {conc:>4}"
template += " | {iops[0]:>6} ~ {iops[1]:>5} | {bw[0]:>7} ~ {bw[1]:>6}"
template += " | {lat[0]:>6} ~ {lat[1]:>5} |"

headers = dict(bs="BS",
               action="operation",
               cache_tp="S/D",
               conc="CONC",
               iops=("IOPS", "dev"),
               bw=("BW kBps", "dev"),
               lat=("LAT ms", "dev"))


def main(argv):
    data = read_data_agent_result(sys.argv[1])
    grouped = groupby_globally(data, key)

    print template.format(**headers)

    for (bs, cache_tp, act, conc), curr_data in sorted(grouped.items()):
        iops = med_dev([i['iops'] * int(conc) for i in curr_data])
        bw = med_dev([i['bw'] * int(conc) for i in curr_data])
        lat = med_dev([i['lat'] / 1000 for i in curr_data])

        iops = round_deviation(iops)
        bw = round_deviation(bw)
        lat = round_deviation(lat)

        params = dict(
            bs=bs,
            action=act,
            cache_tp=cache_tp,
            iops=iops,
            bw=bw,
            lat=lat,
            conc=conc
        )

        print template.format(**params)


if __name__ == "__main__":
    exit(main(sys.argv))

    # vals = [(123, 23), (125678, 5678), (123.546756, 23.77),
    #         (123.546756, 102.77), (0.1234, 0.0224),
    #         (0.001234, 0.000224), (0.001234, 0.0000224)]
    # for val in :
    #     print val, "=>", round_deviation(val)
