#!/usr/bin/python3

import argparse
import logging
import pathlib
import sys

import osc.core

from lib.git_exporter import GitExporter
from lib.importer import Importer
from lib.test_exporter import TestExporter

URL_OBS = "https://api.opensuse.org"
URL_IBS = "https://api.suse.de"

# The order is relevant (from older to newer initial codebase)
# TODO: make something with these, for now we look purely at openSUSE:Factory
PROJECTS = [
    # ("SUSE:SLE-12:GA", "SLE_12", URL_IBS),
    # ("SUSE:SLE-12:Update", "SLE_12", URL_IBS),
    # ("SUSE:SLE-12-SP1:GA", "SLE_12_SP1", URL_IBS),
    # ("SUSE:SLE-12-SP1:Update", "SLE_12_SP1", URL_IBS),
    # ("SUSE:SLE-12-SP2:GA", "SLE_12_SP2", URL_IBS),
    # ("SUSE:SLE-12-SP2:Update", "SLE_12_SP2", URL_IBS),
    # ("SUSE:SLE-12-SP3:GA", "SLE_12_SP3", URL_IBS),
    # ("SUSE:SLE-12-SP3:Update", "SLE_12_SP3", URL_IBS),
    # ("SUSE:SLE-12-SP4:GA", "SLE_12_SP4", URL_IBS),
    # ("SUSE:SLE-12-SP4:Update", "SLE_12_SP4", URL_IBS),
    # ("SUSE:SLE-12-SP5:GA", "SLE_12_SP5", URL_IBS),
    # ("SUSE:SLE-12-SP5:Update", "SLE_12_SP5", URL_IBS),
    # ("SUSE:SLE-15:GA", "SLE_15", URL_IBS),
    # ("SUSE:SLE-15:Update", "SLE_15", URL_IBS),
    # ("SUSE:SLE-15-SP1:GA", "SLE_15_SP1", URL_IBS),
    # ("SUSE:SLE-15-SP1:Update", "SLE_15_SP1", URL_IBS),
    # ("SUSE:SLE-15-SP2:GA", "SLE_15_SP2", URL_IBS),
    # ("SUSE:SLE-15-SP2:Update", "SLE_15_SP2", URL_IBS),
    # ("SUSE:SLE-15-SP3:GA", "SLE_15_SP3", URL_IBS),
    # ("SUSE:SLE-15-SP3:Update", "SLE_15_SP3", URL_IBS),
    # ("SUSE:SLE-15-SP4:GA", "SLE_15_SP4", URL_IBS),
    # ("SUSE:SLE-15-SP4:Update", "SLE_15_SP4", URL_IBS),
]


def export_package(package, repodir, cachedir, gc):
    exporter = GitExporter(URL_OBS, "openSUSE:Factory", package, repodir, cachedir)
    exporter.set_gc_interval(gc)
    exporter.export_as_git()


def main():
    parser = argparse.ArgumentParser(description="OBS history importer into git")
    parser.add_argument("packages", help="OBS package names", nargs="*")
    parser.add_argument(
        "-r",
        "--repodir",
        required=False,
        default=pathlib.Path("repos"),
        type=pathlib.Path,
        help="Local git repository directory",
    )
    parser.add_argument(
        "-c",
        "--cachedir",
        required=False,
        type=pathlib.Path,
        help="Local cache directory",
    )
    parser.add_argument(
        "-g",
        "--gc",
        metavar="N",
        type=int,
        default=200,
        help="Garbage recollect and pack the git history each N commits",
    )
    parser.add_argument(
        "--level",
        "-l",
        default="INFO",
        help="logging level",
    )
    parser.add_argument(
        "--export",
        action="store_true",
        help="Export database fields for the given package as YAML",
    )

    args = parser.parse_args()

    if args.level:
        numeric_level = getattr(logging, args.level.upper(), None)
        if not isinstance(numeric_level, int):
            print(f"Invalid log level: {args.level}")
            sys.exit(-1)
        logging.basicConfig(level=numeric_level)
        if numeric_level == logging.DEBUG:
            osc.conf.config["debug"] = True
            requests_log = logging.getLogger("requests.packages.urllib3")
            requests_log.setLevel(logging.DEBUG)
            requests_log.propagate = True

    if args.export:
        if len(args.packages) != 1:
            print("Can only export one package")
            sys.exit(1)
        TestExporter(args.packages[0]).run()
        return

    if not args.cachedir:
        args.cachedir = pathlib.Path("~/.cache/git-import/").expanduser()

    importer = Importer(URL_OBS, "openSUSE:Factory", args.packages)
    importer.import_into_db()
    for package in args.packages:
        export_package(package, args.repodir, args.cachedir, args.gc)


if __name__ == "__main__":
    main()