#!/usr/bin/env python

import sys
import os
import re
import datetime
import time
import argparse
import shutil

parser = argparse.ArgumentParser()
parser.add_argument("-n", "--name", help="Comma Separated string of test names. Ex: --name='test1, test2, test3'")
parser.add_argument("-w", "--workspace", help="The name of the Jenkin's job/workspace where csv files will be saved'")
args = parser.parse_args()

#Pass in test names as a comma separated string argument. 
#Example: ./Jenkins_getresult.py "Test1,Test2,Test3,Test4"
name_list = args.name.split(",")
result_list = map(lambda x: x.strip(), name_list)
job = args.workspace
if job is None:
    job = ""
print job

#NOTE: testnames list should be in order in which it is run
testnames = result_list
output = ''
header = ''
graphs = ''
testdate = datetime.datetime.now()
#workspace = "/var/lib/jenkins/workspace/ONOS-HA"
workspace = "/var/lib/jenkins/workspace/"
workspace = workspace + job

header +="<p>**************************************</p>"
header +=testdate.strftime('Jenkins test result for %H:%M on %b %d, %Y. %Z')


#NOTE: CASE SPECIFIC THINGS

#THIS LINE IS LOUSY FIXME
if any("HA" in s for s in testnames):
    ##Graphs
    graphs += '<ac:structured-macro ac:name="html">\n'
    graphs += '<ac:plain-text-body><![CDATA[\n'
    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=2&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=1&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=0&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=3&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
    graphs += ']]></ac:plain-text-body>\n'
    graphs += '</ac:structured-macro>\n'
    header +="<p> <a href='https://wiki.onosproject.org/display/OST/Test+Plan+-+HA'>Test Plan for HA Test Cases</a></p>"


# ***


#TestON reporting
for test in testnames:
    passes = 0
    fails = 0
    name = os.popen("ls /home/admin/ONLabTest/TestON/logs/ -rt | grep %s_ | tail -1" % test).read().split()[0]
    path = "/home/admin/ONLabTest/TestON/logs/" + name + "/"
    try:
        #IF exists, move the csv file to the workspace
        shutil.copy(path + test + ".csv", workspace)
    except IOError:
        #File probably doesn't exist
        pass

    output +="<p></p>"
    #output +="   Date: %s, %s %s" % (name.split("_")[2], name.split("_")[1], name.split("_")[3]) + "<p>*******************<p>"
    #Open the latest log folder 
    output += "<h2>Test "+str(test)+"</h2><p>************************************</p>"

    f = open(path + name + ".rpt")

    #Parse through each line of logs and look for specific strings to output to wiki.
    #NOTE: with current implementation, you must specify which output to output to wiki by using
    #main.log.report("") since it is looking for the [REPORT] tag in the logs
    for line in f:
        if re.search("Result summary for Testcase", line):
            output += "<h3>"+str(line)+"</h3>"
            #output += "<br>"
        if re.search("\[REPORT\]", line): 
            line_split = line.split("] ")
            #line string is split by bracket, and first two items (log tags) in list are omitted from output
            #join is used to convert list to string
            line_str = ''.join(line_split[2:])
            output += "<p>"
            output += line_str
            output += "</p>"
        if re.search("Result:", line):
            output += "<p>"
            output += line
            output += "</p>"
            if re.search("Pass", line):
                passes = passes + 1
            elif re.search("Fail", line):
                fails = fails + 1
    f.close()
    #https://wiki.onosproject.org/display/OST/Test+Results+-+HA#Test+Results+-+HA
    #Example anchor on new wiki:        #TestResults-HA-TestHATestSanity
    page_name = "Master+-+HA"
    if "ONOS-HA-Maint" in job:
        page_name = "1.0+-+HA"

    header += "<li><a href=\'#" + str(page_name) + str(test) + "\'> " + str(test) + " - Results: " + str(passes) + " Passed, " + str(fails) + " Failed</a></li>"

    #*********************
    #include any other phrase specific to case you would like to include in wiki here
    if test == "IntentPerf":
        output += "URL to Historical Performance results data: <a href='http://10.128.5.54perf.html'>Perf Graph</a>"
    #*********************

#header_file = open("/tmp/header_ha.txt",'w')
#header_file.write(header)
output = header + graphs + output
print output
