#!/usr/bin/env python3

import argparse
import subprocess
import sys

sys.path.insert(0, "/usr/share/go-utils")
import go_pkgutil as pkgutil


def iter_qlist(paths):
    proc = subprocess.run(
        ["qlist", *paths],
        text=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        check=False,
    )
    if proc.returncode:
        sys.stderr.write(proc.stderr)
        sys.stderr.write("qlist did not run successfully.\n")
        sys.stderr.write("Please emerge app-portage/portage-utils if needed.\n")
    for line in proc.stdout.splitlines():
        yield line.rstrip()


def main(argv):
    parser = argparse.ArgumentParser(
        prog="go-checkdeps", description="List packages providing ELF dependencies."
    )
    parser.add_argument("-q", "--quiet", action="store_true")
    parser.add_argument("-v", "--verbose", action="store_true")
    parser.add_argument("-d", "--debug", action="store_true")
    parser.add_argument("packages", nargs="+")
    args = parser.parse_args(argv[1:])

    lib_seen = set()
    pkg_to_objects = {}

    for obj in iter_qlist(args.packages):
        if not pkgutil.is_elf(obj):
            if args.verbose:
                print(f"{obj} is not executable or a regular ELF file")
            continue

        for lib in pkgutil.scanelf_libs(obj):
            if lib in lib_seen:
                continue
            lib_seen.add(lib)
            owner = pkgutil.package_for_library(lib)
            if owner:
                pkg_to_objects.setdefault(owner, set()).add(obj)

    for owner in sorted(pkg_to_objects):
        print(owner)
        if not args.quiet:
            for obj in sorted(pkg_to_objects[owner]):
                print(f"\t{obj}")

    if args.verbose:
        for lib in sorted(lib_seen):
            print(lib)

    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))
