#!/usr/bin/python
from __future__ import print_function

import os
import sys

DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".dbg.out"
OPT_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".dbg.opt.out"
LOG_FILE = "Output/" + sys.argv[1] + ".log"
NATIVE_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".native.dbg.out"
NATIVE_OPT_DBG_OUTPUT_FILE = "Output/" + sys.argv[1] + ".native.dbg.opt.out"
NATIVE_LOG_FILE = "Output/" + sys.argv[1] + ".native.log"
REPORT_FILE = "Output/" + sys.argv[1] + ".dbg.report.txt"


class BreakPoint:
    def __init__(self, bp_name):
        self.name = bp_name
        self.values = {}
        self.missing_args = []
        self.matching_args = []
        self.notmatching_args = []
        self.missing_bp = False

    def setMissing(self):
        self.missing_bp = True

    def getArgCount(self):
        return len(self.values)

    def getMissingArgCount(self):
        if self.missing_bp == True:
            return len(self.values)
        return len(self.missing_args)

    def getMatchingArgCount(self):
        if self.missing_bp == True:
            return 0
        return len(self.matching_args)

    def getNotMatchingArgCount(self):
        if self.missing_bp == True:
            return 0
        return len(self.notmatching_args)

    def recordArgument(self, arg_name, value):
        self.values[arg_name] = value

    def __repr__(self):
        print(self.name)
        for k, v in self.values.items():
            print(k, "=", v)
        return ""

    def compare_args(self, other, file):
        myitems = self.values.items()
        otheritems = list(other.values.items())
        match = False
        for i, my_item in enumerate(my_items):
            if i >= len(otheritems):
                match = True
                self.missing_args.append(myitem[0])
            elif cmp(myitem[1], otheritems[i][1]):
                match = True
                self.notmatching_args.append(myitem[0])
            else:
                self.matching_args.append(myitem[0])

        self.print_list(self.matching_args, " Matching arguments ", file)
        self.print_list(self.notmatching_args, " Not Matching arguments ", file)
        self.print_list(self.missing_args, " Missing arguments ", file)
        return match

    def print_list(self, items, txt, pfile):
        if len(items) == 0:
            return
        pfile.write(self.name)
        pfile.write(txt)
        for e in items:
            pfile.write(e)
            pfile.write(" ")
        pfile.write("\n")


def read_input(filename, dict):
    f = open(filename, "r")
    lines = f.readlines()
    for l in range(len(lines)):
        c = lines[l].split()
        if c[0] == "#Breakpoint":
            bp = dict.get(c[2])
            if bp is None:
                bp = BreakPoint(c[1])
            dict[c[2]] = bp
        if c[0] == "#Argument":
            bp = dict.get(c[2])
            if bp is None:
                bp = BreakPoint(c[1])
            dict[c[2]] = bp
            bp.recordArgument(c[3], c[4])
    return


f1_breakpoints = {}
read_input(DBG_OUTPUT_FILE, f1_breakpoints)
f1_items = f1_breakpoints.items()

f2_breakpoints = {}
read_input(OPT_DBG_OUTPUT_FILE, f2_breakpoints)
f2_items = f2_breakpoints.items()

f = open(LOG_FILE, "w")
f.write("Log output\n")
for id, bp in f2_items:
    bp1 = f1_breakpoints.get(id)
    if bp1 is None:
        bp.setMissing()
    else:
        bp1.compare_args(bp, f)
f.close()

nf1_breakpoints = {}
read_input(NATIVE_DBG_OUTPUT_FILE, nf1_breakpoints)
nf1_items = nf1_breakpoints.items()

nf2_breakpoints = {}
read_input(NATIVE_OPT_DBG_OUTPUT_FILE, nf2_breakpoints)
nf2_items = nf2_breakpoints.items()

nfl = open(NATIVE_LOG_FILE, "w")
for id, bp in nf2_items:
    bp1 = nf1_breakpoints.get(id)
    if bp1 is None:
        bp.setMissing()
    else:
        bp1.compare_args(bp, nfl)
nfl.close()

f1_arg_count = 0
f1_matching_arg_count = 0
f1_notmatching_arg_count = 0
f1_missing_arg_count = 0
for f1_item in f1_items:
    bp = f1_item[1]
    f1_arg_count = f1_arg_count + bp.getArgCount()
    f1_matching_arg_count = f1_matching_arg_count + bp.getMatchingArgCount()
    f1_notmatching_arg_count = f1_notmatching_arg_count + bp.getNotMatchingArgCount()
    f1_missing_arg_count = f1_missing_arg_count + bp.getMissingArgCount()

nf1_arg_count = 0
nf1_matching_arg_count = 0
nf1_notmatching_arg_count = 0
nf1_missing_arg_count = 0
for nf1_item in nf1_items:
    bp = nf1_item[1]
    nf1_arg_count = nf1_arg_count + bp.getArgCount()
    nf1_matching_arg_count = nf1_matching_arg_count + bp.getMatchingArgCount()
    nf1_notmatching_arg_count = nf1_notmatching_arg_count + bp.getNotMatchingArgCount()
    nf1_missing_arg_count = nf1_missing_arg_count + bp.getMissingArgCount()

rf = open(REPORT_FILE, "w")
rf.write("---------------------------------------------------------------\n")
rf.write(">>> ========= '")
rf.write(sys.argv[1])
rf.write("'")
rf.write(" Program\n")
rf.write("---------------------------------------------------------------\n\n")
rf.write("GCC Total Arguments: ")
rf.write(str(nf1_arg_count))
rf.write("\n")
rf.write("GCC Matching Arguments: ")
rf.write(str(nf1_matching_arg_count))
rf.write("\n")
rf.write("GCC Not Matching Arguments: ")
rf.write(str(nf1_notmatching_arg_count))
rf.write("\n")
rf.write("GCC Missing Arguments: ")
rf.write(str(nf1_missing_arg_count))
rf.write("\n")
rf.write("LLVM Total Arguments: ")
rf.write(str(f1_arg_count))
rf.write("\n")
rf.write("LLVM Matching Arguments: ")
rf.write(str(f1_matching_arg_count))
rf.write("\n")
rf.write("LLVM Not Matching Arguments: ")
rf.write(str(f1_notmatching_arg_count))
rf.write("\n")
rf.write("LLVM Missing Arguments: ")
rf.write(str(f1_missing_arg_count))
rf.write("\n")
rf.close()
