#!/usr/bin/env python3

import lpl_common
import sys
from debian import debian_support
import os
import re

# XXX this should be pulled from cve_lib
lts_releases = ['trusty', 'xenial', 'bionic', 'focal', 'jammy']
esm_regex = "esm[0-9]+$"

# cve_lib may not be in PYTHONPATH so try harder to find it
try:
    import cve_lib
except ImportError:
    uct_path = os.getenv('UCT')
    if uct_path is not None:
        sys.path.append(os.path.join(uct_path, 'scripts'))
        import cve_lib

def get_ppa_list():
    ppa_list = {}
    lp = lpl_common.connect()
    distribution = lp.distributions['ubuntu']
    ubuntu = lp.distributions['ubuntu']
    for ppa in ["infra", "apps"]:
        ppa_list[ppa] = {}
        for release in lts_releases:
            series = ubuntu.getSeries(name_or_version = release)
            ppa_full_name = "ubuntu-esm/esm-%s-security" % ppa
            archive, group, ppa_full_name = lpl_common.get_archive(ppa_full_name,
                    lp, False, distribution = distribution)

            ppa_list[ppa].update({release: archive.getPublishedSources(status = 'Published',
                distro_series = series)})
    return ppa_list

def get_esm_released_packages():
    (cves, uems, rcves) = cve_lib.get_cve_list_and_retired()
    esm_packages = dict()
    for cve in cves:
        cve_data = cve_lib.load_cve(cve_lib.find_cve(cve))
        for package, releases in cve_data['pkgs'].items():
            for release, status in releases.items():
                version = status[1]
                if not re.search(esm_regex, version):
                    continue
                if package not in esm_packages:
                    esm_packages[package] = dict()

                if release in esm_packages[package]:
                    # print("%s: %s > %s" % (package, version, esm_packages[package][release]))
                    if debian_support.version_compare(version,
                            esm_packages[package][release]):
                        esm_packages[package][release] = version
                else:
                    esm_packages[package][release] = version
    return esm_packages

ppa_list = get_ppa_list()
repo_list = get_esm_released_packages()

for ppa in ["infra", "apps"]:
    for release in lts_releases:
        for package in ppa_list[ppa][release]:
            name = package.source_package_name
            version = package.source_package_version

            if name == "hello" or not re.search(esm_regex, version):
                continue

            if name not in repo_list or release + "/esm" not in repo_list[name]:
                print("%s for %s, version %s, not found in UCT!" % (name, release, version))
