#!/usr/bin/env python3

import argparse
import os
import yaml


def parse_yaml_data(yaml_path):
    if not os.path.exists(yaml_path):
        raise RuntimeError("YAML file not present: {}".format(yaml_path))
    try:
        with open(yaml_path, "r") as f:
            root = yaml.safe_load(f)
    except yaml.YAMLError as e:
        raise RuntimeError("Input data is not valid YAML format: {}".format(e))
    repositories = root["repositories"]
    repos = dict()
    try:
        for path in repositories:
            attrs = repositories[path]
            repos[path] = {
                "type": attrs["type"],
                "url": attrs["url"],
                "version": attrs["version"],
            }
    except TypeError as e:
        print("{}".format(e))
    return repos


def clone_single_repo(full_path, url, branch):
    cmd_pattern = "git clone --branch {} {} {}"
    cmd = cmd_pattern.format(branch, url, full_path)
    os.system(cmd)


def clone_repos(repos, base_path):
    if not os.path.exists(base_path):
        raise RuntimeError("Base path not present: {}".format(base_path))
    for path, repo in repos.items():
        full_path = os.path.join(base_path, path)
        print(
            "=== {} ({}) [branch: {}] ===".format(
                full_path, repo["type"], repo["version"]
            )
        )
        clone_single_repo(full_path, repo["url"], repo["version"])


def parse_args():
    parser = argparse.ArgumentParser(description="Clone 3rd party repos.")
    parser.add_argument("--input", required=True, help="Path to input YAML file.")
    parser.add_argument("--path", required=True, help="Base path to clone repos into.")
    args = parser.parse_args()
    return args


def main():
    args = parse_args()
    repos = parse_yaml_data(args.input)
    clone_repos(repos, args.path)


if __name__ == "__main__":
    main()
