#!/usr/bin/env python
import os.path
import sys
from stats import mean, stdev


def format_inline(datum):
    if isinstance(datum, unicode):
        return '"%s"' % (datum.replace('"', '\"').encode('utf-8'), )
    elif isinstance(datum, str):
        return '"%s"' % (datum.replace('"', '\"'), )
    else:
        return str(datum)


def print_inline_data(data):
    print '\n'.join([' '.join([format_inline(col) for col in row])
                      for row in data])
    print 'e'


def read_result(file_name):
    per_au = {}
    au_num = None
    for line in file(file_name):
        if 'MiB' not in line:
            au_num = int(line.split()[0])
            continue

        speed = float(line.split()[-1][:-3])
        per_au.setdefault(au_num, []).append(speed)

    return per_au


def plot_mean_stdev(prefix, per_au):
    data = [(num_au, mean(per_au[num_au]), stdev(per_au[num_au]))
            for num_au in sorted(per_au.keys())]
    num_samples = min([len(values) for values in per_au.values()])
    print 'reset'
    print "set output '%s.mean_stdev.png'" % (prefix, )
    print "set xlabel 'number of open AUs (%d samples each)'" % (num_samples, )
    print "set ylabel 'write speed (stdev) [MiB/s]'"
    print 'set xrange [0.5:%d.5]' % (max(per_au.keys()), )
    print 'set yrange [0:*]'
    print 'set key inside right'
    print "plot '-' with errorlines title '%s'" % (os.path.basename(prefix), )
    print_inline_data(data)


def print_syntax(my_name):
    print "Syntax: " + my_name + " <result file>"
    return 64


def main(my_name, args):
    if len(args) != 1:
        return print_syntax(my_name)

    result_file_name, = args
    prefix = result_file_name
    if result_file_name.endswith('.result'):
        prefix = result_file_name[:-7]

    per_au = read_result(result_file_name)

    print 'set terminal png size 1024,768'
    plot_mean_stdev(prefix, per_au)
    return 0


sys.exit(main(sys.argv[0], sys.argv[1:]))
