# Helper/utility functions to work with the IMAGE_BOOT_FILES variable and its
# expected behvaior with regards to the contents of the DEPLOY_DIR_IMAGE.
#
# The use of these functions assume that the deploy directory is populated with
# any dependent files/etc. Such that the recipe using these functions depends
# on the recipe that provides the files being used/queried.

def boot_files_split_expand(d):
    # IMAGE_BOOT_FILES has extra renaming info in the format '<source>;<target>'
    for f in (d.getVar("IMAGE_BOOT_FILES") or "").split(" "):
        parts = f.split(";", 1)
        sources = [parts[0]]
        if "*" in parts[0]:
            # has glob part
            import glob
            deployroot = d.getVar("DEPLOY_DIR_IMAGE")
            sources = []
            for i in glob.glob(os.path.join(deployroot, parts[0])):
                sources.append(os.path.basename(i))

        # for all sources, yield an entry
        for s in sources:
            if len(parts) == 2:
                yield s, parts[1]
            yield s, s

def boot_files_bitstream(d):
    expectedfiles = [("bitstream", True)]
    expectedexts = [(".bit", True), (".bin", False)]
    # search for bitstream paths, use the renamed file. First matching is used
    for source, target in boot_files_split_expand(d):
        # skip boot.bin and u-boot.bin, it is not a bitstream
        skip = ["boot.bin", "u-boot.bin"]
        if source in skip or target in skip:
            continue

        for e, t in expectedfiles:
            if source == e or target == e:
                return target, t
        for e, t in expectedexts:
            if source.endswith(e) or target.endswith(e):
                return target, t
    return "", False

def boot_files_dtb_filepath(d):
    dtbs = (d.getVar("IMAGE_BOOT_FILES") or "").split(" ")
    for source, target in boot_files_split_expand(d):
        if target.endswith(".dtb"):
            return target
    return ""

