import xml.etree.ElementTree as ElementTree
from ee.kicad.bom import *


def read_bom(path):
    def child_text(e, child_tag):
        child = e.find(child_tag)

        return child.text if child is not None else None

    def add_comp(b, comp):
        ref = comp.get("ref")
        value = child_text(comp, "value")
        footprint = child_text(comp, "footprint")
        libsource = comp.find("libsource")
        l, p = (None, None)
        if libsource is not None:
            lib = libsource.get("lib")
            part = libsource.get("part")
            if lib is not None and part is not None:
                l = b.find_library(lib)
                p = l.add_part(part)

        c = Comp(ref, value, l, p, footprint)

        fields = comp.find("fields")
        if fields is not None:
            for f in fields.findall("field"):
                key = f.get("name")
                value = f.text
                c.add_field(key, value)

        b.add_component(c)
        return c

    with open(path) as f:
        tree = ElementTree.parse(path)
        root = tree.getroot()

        b = Bom()
        comp = root.find("components").findall("comp")
        for c in comp:
            add_comp(b, c)

        return b