#!/usr/bin/python
r"""
#############################################################
#    @brief   Uses robot framework API to extract test result
#             data from output.xml generated by robot tests.
#             For more information on the Robot Framework API
#             http://robot-framework.readthedocs.io/en/3.0
#             /autodoc/robot.result.html
#############################################################
"""
import sys
import getopt
import csv
from datetime import datetime
import robot.errors
from robot.api import ExecutionResult
from robot.result.visitor import ResultVisitor


def parse_output_xml(i_source, i_dest):
    result = ExecutionResult(i_source)
    result.configure(stat_config={'suite_stat_level': 2,
                                  'tag_stat_combine': 'tagANDanother'})

    stats = result.statistics
    print "--------------------------------------"
    print "Total Test Count:\t",\
          stats.total.critical.passed + stats.total.critical.failed
    print "Total Test Failed:\t", stats.total.critical.failed
    print "Total Test Passed:\t", stats.total.critical.passed
    print "Test Start Time:\t", result.suite.starttime
    print "Test End Time:\t\t", result.suite.endtime
    print "--------------------------------------"

    # Use ResultVisitor object and save off the test data info
    class TestResult(ResultVisitor):
        def __init__(self):
            self.testData = []

        def visit_test(self, test):
            self.testData += [test]

    collectDataObj = TestResult()
    result.visit(collectDataObj)

    # Write the result statistics attributes to CSV file
    l_csvlist = []
    l_subsys = 'OPENBMC'
    l_test_type = 'FTC'
    l_pse_rel = 'OBMC910'

    # Default header
    l_header = ['test_start', 'test_end', 'subsys', 'test_type',
                'test_result', 'test_name', 'pse_rel']

    l_csvlist.append(l_header)

    # Generate CSV file onto the path with current time stamp
    l_base_dir = i_dest
    l_timestamp = datetime.utcnow().strftime("%Y-%m-%d-%H-%M-%S")
    l_csvfile = l_base_dir + l_timestamp + ".csv"

    print "Writing data into csv file:", l_csvfile

    for testcase in collectDataObj.testData:
        # Test category : Test case type
        l_test_name = str(testcase.parent) + ":" + str(testcase)

        # Test Result pass=0 fail=1
        if testcase.status == 'PASS':
            l_test_result = 0
        else:
            l_test_result = 1

        # Data Sequence: test_start,test_end,subsys,test_type,
        #                test_result,test_name,pse_rel
        l_data = [testcase.starttime, testcase.endtime, l_subsys,
                  l_test_type, l_test_result, l_test_name, l_pse_rel]
        l_csvlist.append(l_data)

    # Open the file and write to the CSV file
    l_file = open(l_csvfile, "w")
    l_writer = csv.writer(l_file, lineterminator='\n')
    l_writer.writerows(l_csvlist)
    l_file.close()


def usage():
    name = 'gen_csv_results.py'
    print 'Usage: '
    print name, '-s <source path> -d <destination path>'
    print '\t-s | --source=  : output.xml robot test result file path'
    print '\t-d | --dest=    : Where the *.csv file will be generated'
    sys.exit()


def main(argv):

    source = ''
    dest = ''
    try:
        opts, args = getopt.getopt(argv, "h:s:d:", ["source=", "dest="])
    except getopt.GetoptError:
        usage()

    for opt, arg in opts:
        if opt == '-h':
            usage()
        elif opt in ("-s", "--source"):
            source = arg
        elif opt in ("-d", "--dest"):
            dest = arg

    if source == '':
        usage()
        print 'ERROR: Provide input file path to robot generated output.xml '

    if dest == '':
        usage()
        print 'ERROR: Destination directory where *.csv file will be generated'

    parse_output_xml(source, dest)

if __name__ == "__main__":
    main(sys.argv[1:])
