#!/usr/bin/python3

# SPDX-FileCopyrightText: 2021 Luca Beltrame <lbeltrame@kde.org>
# SPDX-License-Identifier: BSD-3-Clause

import argparse
import logging

import keyring
import keyring.backend
from keyrings.alt.file import PlaintextKeyring
import lxml.etree as etree
import requests


keyring.set_keyring(PlaintextKeyring())

API_URL = "https://api.opensuse.org/build"
OBS_URL = "https://api.opensuse.org/trigger/runservice"
REPOSITORIES = [
    "KDE:Unstable:Frameworks",
    "KDE:Unstable:Applications",
    "KDE:Unstable:Extra"
    ]


def trigger_update(repository, package_name, token):

    header = {"Authorization": f"Token {token}"}
    parameters = {"project": repository, "package": package_name}

    logging.info("Updating package %s", package_name)
    result = requests.post(OBS_URL, params=parameters, headers=header)

    if not result:
        logging.error("Error during service run, package %s, error code %s",
                      package_name, result.status_code, result.url)
        return False

    logging.debug("Package %s complete", package_name)
    return result


def check_status(project, username):

    password = keyring.get_password("obs", username)
    token = keyring.get_password("obstoken", "token")
    url = "{0}/{1}/_result".format(API_URL, project)
    result = requests.get(url, auth=(username, password))

    logging.debug("Checking broken packages in %s", project)

    if not result:
        return

    contents = etree.fromstring(result.content)
    broken_packages = set(contents.xpath(
        '//result[@arch="x86_64"]/status[@code="broken"]/@package'))

    if not broken_packages:
        logging.debug("No broken packages found in %s", project)
        return

    logging.info("Found %s broken packages", len(broken_packages))
    for package in broken_packages:
        logging.info("Triggering package %s", package)
        trigger_update(project, package, token)


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("username", help="OBS username")

    options = parser.parse_args()
    logging.basicConfig(format='%(levelname)s - %(message)s',
                        level=logging.INFO)

    for project in REPOSITORIES:
        check_status(project, options.username)


if __name__ == "__main__":
    main()