#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

import argparse
import json
import os
import sys

import kobo.conf
import pungi.checks
import pungi.util


def load_file(source, conf):
    try:
        with open(source) as f:
            conf.load_from_dict(json.load(f))
    except ValueError:
        conf.load_from_file(source)


def load_source(source, conf):
    if os.path.isfile(source):
        load_file(source, conf)
    else:
        load_file(os.path.join(source, "logs/global/config-dump.global.log"), conf)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "sources",
        metavar="SOURCE",
        nargs="+",
        help=(
            "Source for the configuration; either a compose "
            "or arbitrary number of config files."
        ),
    )
    parser.add_argument(
        "--freeze-event",
        metavar="ID",
        type=pungi.util.parse_koji_event,
        help=(
            "Include this koji event in the created config; "
            "takes either event ID or path to a compose"
        ),
    )
    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        "--just-dump",
        action="store_true",
        help=(
            "Do not transform the config in any way. Default values are not "
            "added, git references are not resolved."
        ),
    )
    group.add_argument(
        "--offline", action="store_true", help="Do not resolve git references."
    )

    args = parser.parse_args()

    conf = kobo.conf.PyConfigParser()

    for source in args.sources:
        load_source(source, conf)

    if not args.just_dump:
        errors, _ = pungi.checks.validate(conf, offline=args.offline)
        if errors:
            for error in errors:
                print(error, file=sys.stderr)
            return False

    if args.freeze_event:
        conf["koji_event"] = args.freeze_event

    json.dump(conf, sys.stdout, sort_keys=True, indent=4)
    return True


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