#!/usr/bin/env python
import sys, argparse
import csv

import matplotlib.pyplot as plt
import numpy as np
from collections import OrderedDict

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("csv_files", nargs=1, default=None, help="CSV files with level runtimes")
    parser.add_argument("-f", default=None, help="Output filename")
    parser.add_argument("--min_fwd_width", type=int, default=None, help="Minimum forward width for parllel")
    parser.add_argument("--min_bck_width", type=int, default=None, help="Minimum backward width for parllel")

    args = parser.parse_args()

    return args

def main():
    args = parse_args()

    data = {}
    for filename in args.csv_files:
        with open(filename) as f:
            data[filename] = {}
            csv_reader = csv.DictReader(f)
            
            for field in csv_reader.fieldnames:
                data[filename][field] = []

            for row in csv_reader:
                for field in csv_reader.fieldnames:
                    data[filename][field].append(float(row[field]))

    for filename, series in data.iteritems():
        print "File: ", filename
        #for series_name, data_values in series.iteritems():
            #print "\tSeries: ", series_name
            #print "\tValuse: ", data_values


    series = OrderedDict()

    analyzer_colors = OrderedDict()
    analyzer_colors['Serial']= 'r'
    analyzer_colors['Dynamic']= 'b'
    analyzer_colors['Levelized']= 'g'
    analyzer_colors['No Dep']= 'y'

    for analyzer, color in analyzer_colors.iteritems():
        series['%s' % analyzer] = {'label': '%s' % analyzer, 'linestyle': "-", 'color': color}
        series['%s SIMD_AUTO' % analyzer] = {'label': '%s SIMD_AUTO' % analyzer, 'linestyle': "--", 'color': color}
        series['%s SIMD_INTRINSICS' % analyzer] = {'label': '%s SIMD_INTR' % analyzer, 'linestyle': "-.", 'color': color}
    

    #Plot results
    fig, ax = plt.subplots(1)

    for series_name, series_info in series.iteritems():
        ax.plot(data[args.csv_files[0]]["Time Vector Width"], data[args.csv_files[0]][series_name], linestyle=series_info['linestyle'], color=series_info['color'], label=series_info['label'], linewidth=2)
    ax.legend(loc='best', prop={'size': 13})
    ax.set_ylabel("Time (sec)")
    ax.set_xlabel("Time Vector Width")
    ax.set_title("Run-time Scaling With Time Vector Width")
    ax.set_xlim(left=1, right=max(data[args.csv_files[0]]["Time Vector Width"]))

    ##Cummulative Times
    #for series_name in derived_series.keys():
        #if series_name.startswith("Cumm Time"):
            #ax[0].plot(data[args.csv_files[0]]["Level"],  derived_series[series_name], label=series_name[len("Cumm Time"):])
    #ax[0].legend(loc='best')
    #ax[0].set_ylabel("Cummulative\nTime (sec)")
    #ax[0].set_title("Per Level Performance Characteristics")
    #ax[0].set_ylim(bottom=0)

    ##Per-level Speed-up
    #for traversal in traversals:
        #series_name = "Avg Level Speed-up %s" % traversal

        #ax[1].plot(data[args.csv_files[0]]["Level"], derived_series[series_name], label=traversal)
    #ax[1].legend(loc='best')
    ##ax[1].set_yscale('log')
    #ax[1].set_ylabel("Level Speed-Up\n(N_AVG %d)" % N_AVG)
    #ax[1].set_ylim(bottom=0)

    #for traversal in traversals:
        #series_name = "Cumm Speed-Up %s" % traversal

        #ax[2].plot(data[args.csv_files[0]]["Level"], derived_series[series_name], label=traversal)
    #ax[2].legend(loc='best')
    #ax[2].set_ylabel("Cummulative\nSpeed-Up")
    #ax[2].set_ylim(bottom=0)

    #ax[3].plot(data[args.csv_files[0]]["Level"], data[args.csv_files[0]]["Width"], label="width")

    #if args.min_fwd_width:
        #ax[3].plot(data[args.csv_files[0]]["Level"], [args.min_fwd_width for x in xrange(len(data[args.csv_files[0]]["Level"]))], label="Min // Fwd")
    #if args.min_fwd_width:
        #ax[3].plot(data[args.csv_files[0]]["Level"], [args.min_bck_width for x in xrange(len(data[args.csv_files[0]]["Level"]))], label="Min // Bck")

    #ax[3].set_yscale('log')
    #ax[3].set_xlabel("Level")
    #ax[3].set_ylabel("Level Width")
    ##ax[3].set_xlim(right=len(data[args.csv_files[0]]["Level"]))
    #ax[3].legend(loc='best')

    plt.tight_layout()
    if args.f:
        plt.savefig(args.f, dpi=300)
    else:
        plt.show()


if __name__ == "__main__":
    main()