#!/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:
        with open(l_csvfile, "w") as output:
            writer = csv.writer(output, lineterminator='\n')
            writer.writerows(l_csvlist)

        # 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)

    l_csvlist.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:])
