#! /usr/bin/python3

import os
import fnmatch
import rpm
import subprocess


def target_filename(h):
    if h[rpm.RPMTAG_SOURCEPACKAGE]:
        extra = ".src.rpm"
        dir = "src"
    else:
        extra = h.sprintf(".%{ARCH}.rpm").strip()
        dir = h[rpm.RPMTAG_ARCH]
    return dir, h.sprintf("%{NAME}-%{VERSION}-%{RELEASE}") + extra


def collect_rpms(dir, targetdir):
    ts = rpm.TransactionSet()
    # no public key available - need to fix that
    ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES)
    for root, dir, files in os.walk(dir):
        print(root)
        print("")
        for item in fnmatch.filter(files, "*.rpm"):
            source = os.path.join(root, item)
            fd = os.open(source, os.O_RDONLY)
            h = ts.hdrFromFdno(fd)
            subdir, target = target_filename(h)
            print("... ", item, target)
            os.close(fd)
            subdir = os.path.join(targetdir, subdir)
            if not os.path.exists(subdir):
                os.makedirs(subdir)
            try:
                os.link(source, os.path.join(subdir, target))
            except FileExistsError:
                print(f"{target} already exists")
        print("")


def parse_args():
    from optparse import OptionParser

    parser = OptionParser()
    # there are the options passed by the build script
    parser.add_option(
        "--create-instsource", metavar="IMAGE", help="Pick up repos from there"
    )
    parser.add_option("--logfile", metavar="OUTPUT", help="Only terminal supported")
    parser.add_option("--root", metavar="ROOT", help="KIWI compat - working dir")

    return parser.parse_args()


if __name__ == "__main__":

    (options, args) = parse_args()
    print(options, args)
    # the 'main' is hardcoded in build script
    maindir = os.path.join(options.root, "main")
    collect_rpms(os.path.join(options.create_instsource, "repos"), maindir)
    subprocess.run(["createrepo", maindir])

