#! /usr/bin/python3 -s

'''
Project: RPQR
Author: Tomáš Korbař (tomas.korb@seznam.cz)
Copyright 2021 - 2022 Tomáš Korbař
'''

import os

from rpqr.library.RPQRConfiguration import RPQRConfiguration
from rpqr.query.RPQRQuery import RPQRQuery
import rpqr.loader.plugins.implementations

"""
This is a proof of concept script which shows current state of implementation
and performs real life use case.
mhroncok sends mail to fedora-devel mailing list once in a while to
point out newly orphaned packages to maintainer which are affected by
it becoming an orphan. Original script is written only for that purpose
and takes a long time to execute. Thus make the whole process general and
faster. That is our goal.
"""

if __name__ == "__main__":
    # set up configuration
    config = RPQRConfiguration([os.path.dirname(rpqr.loader.plugins.implementations.__file__)],
                               [("fedora-repo", "https://mirror.karneval.cz/pub/linux/fedora/linux/development/rawhide/Everything/x86_64/os/"),
                                ("source-repo", "https://mirror.karneval.cz/pub/linux/fedora/linux/development/rawhide/Everything/source/tree/")],
                                {"RPQRMaintainerPlugin":{"url": "https://src.fedoraproject.org/extras/pagure_owner_alias.json"}})
    query = RPQRQuery(config)
    result = query.performQuery("MAINTAINER('orphan')")
    for node in list(result.nodes):
        # now we will recursively gather packages which depend on every orphaned package
        dependentPackages = query.performQuery(
            "WHATDEPENDSON('%s', 20)" % result.nodes[node]["name"])
        # get maintainers affected by this change
        maintainerList = []
        for pkgId in list(dependentPackages.nodes):
            for maintainer in dependentPackages.nodes[pkgId]["maintainer"]:
                if maintainer not in maintainerList:
                    maintainerList.append(maintainer)
        maintainerList = list(dict.fromkeys(maintainerList))
        # orphan is just a placeholder so remove it
        maintainerList.remove('orphan')
        print("%s => " % dependentPackages.nodes[node]["name"], end="")
        for maintainer in maintainerList:
            print("%s " % maintainer, end="")
        print()

