import xml.etree.ElementTree as ElementTree
import csv
import os


def parse_xml(filepath: str):
    """
    Parses an XML File
    It is assumed, that packets are placed on the second hierarchical level and packet-information is encoded
    as attributes

    :param filepath: the path to the XML file to be parsed
    :return: a List of Dictionaries, each Dictionary contains the information of one packet
    """

    tree = ElementTree.parse(filepath)
    root = tree.getroot()

    # Convert Tree to List of Dictionaries
    packets = []
    for child in root:
        packets.append(child.attrib)

    return packets


def parse_csv_to_xml(filepath: str):
    """
    Converts a CSV file into an XML file. Every entry is converted to a child with respective attributes of the
    root node

    :param filepath: the path to the CSV file to be parsed
    :return: a path to the newly created XML file
    """

    filename = os.path.splitext(filepath)[0]
    # build a tree structure
    root = ElementTree.Element("trace")
    root.attrib["path"] = filename

    # parse the csvFile into reader
    with open(filepath, "rt") as csvFile:
        reader = csv.reader(csvFile, delimiter=",")
        # loop through the parsed file, creating packet-elements with the structure of the csvFile as attributes
        lineno = -1  # lines start at zero
        for line in reader:
            lineno += 1
            if not line:
                continue

            packet = ElementTree.SubElement(root, "packet")
            for element in line:
                element = element.replace(" ", "")
                key, value = element.split(":")
                packet.attrib[key] = str(value)
            packet.attrib["LineNumber"] = str(lineno)

    # writing the ElementTree into the .xml file
    tree = ElementTree.ElementTree(root)
    filepath = filename + ".xml"
    tree.write(filepath)
    return filepath
