import os
import argparse
import xunitparser
from mdutils.mdutils import MdUtils

def parse_junit_report(file_path, dest_folder):

    with open(file_path, 'rb') as f:
        ts, _ = xunitparser.parse(f)

    fail = 0
    skip = 0
    success = 0
    total_duration = 0
    failure_info_json_objects = []

    if dest_folder != "" and not os.path.exists(dest_folder):
        os.makedirs(dest_folder)

    md_file_name=os.path.abspath(dest_folder + '/Test_Report')

    for testcase in ts:
        test_name = testcase.classname
        test_method = testcase.methodname
        test_status = testcase.result
        test_duration = testcase.time.total_seconds()
        total_duration += test_duration

        if test_status == "success":
            success += 1
        elif test_status == "failure":
            fail += 1
            failure_message = testcase.message
            failure_info = {
                "name": test_name,
                "method": test_method,
                "message": failure_message
            }
            failure_info_json_objects.append(failure_info)
        elif test_status == "skipped":
            skip += 1

    mdFile = MdUtils(file_name=md_file_name, title='Test Report')
    mdFile.new_line(f"Test Results: Runs: {success + fail + skip}, Success: {success} :white_check_mark:, Failure: {fail} :x:, Skipped: {skip} :white_circle:")
    mdFile.new_line(f"Total Duration: {total_duration} seconds :clock1:")

    if failure_info_json_objects != []:
        mdFile.new_line("")
        mdFile.new_header(level=1, title='Failure')
        list_of_strings = ["Name", "Method", "Message"]
        columns_len = len(list_of_strings)
        print(failure_info_json_objects)
        for obj in failure_info_json_objects:
            name = obj["name"]
            method = obj["method"]
            message = obj["message"].replace('\r', ' ').replace('\n', ' ')
            list_of_strings.extend([name, method, message])
        mdFile.new_line()
        mdFile.new_table(columns=columns_len, rows=len(failure_info_json_objects)+1, text=list_of_strings, text_align='center')

    mdFile.create_md_file()

    return md_file_name + '.md'

def write_summery_file_content(file_path, env_variable_name):
    try:
        with open(file_path, 'r') as file:
            content = file.read()
            summery_file = os.environ.get(env_variable_name)
            with open(summery_file, "a") as file:
                file.write(content)
    except FileNotFoundError:
        print(f"File '{file_path}' not found.")
    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Parse XML file with optional folder.')
    parser.add_argument('xml_file', help='Path to the XML file.')
    parser.add_argument('dest_folder', nargs='?', help='Markdown file dest folder.', default="")
    parser.add_argument('env_variable_name', nargs='?', help='Environment variable name to set.', default="GITHUB_STEP_SUMMARY")
    args = parser.parse_args()

    if not args.xml_file:
        print("Error: Missing required argument 'xml_file'.")
        parser.print_help()
        sys.exit(1)

    md_file_path = parse_junit_report(args.xml_file, args.dest_folder)

    write_summery_file_content(md_file_path, args.env_variable_name)
