# Copyright (c) 2015, MapR Technologies
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.


import argparse
import json
import sys

_GROUP_VERSION_SEPARATOR = ","
_ALL_GROUP_VERSION = "all"


def _build_parser():
    parser = argparse.ArgumentParser()

    parser.add_argument("packages", help="path to the packages.json")
    parser.add_argument("spec", help="path to the spec.json")
    parser.add_argument("--separator", default=":",
                        help="separator between package name"
                             " and version in output")

    return parser


def _load_json(path):
    with open(path) as json_file:
        return json.load(json_file)


def _version_matches(version, group_version):
    if group_version == _ALL_GROUP_VERSION:
        return True

    for gv in group_version.split(_GROUP_VERSION_SEPARATOR):
        if version.startswith(gv):
            return True

    return False


def _get_packages(version, group_spec):
    for group_version in group_spec:
        if _version_matches(version, group_version):
            return group_spec[group_version]

    return group_spec[_ALL_GROUP_VERSION]


def _get_package_versions(spec, package_groups):
    return [(package, version)
            for pg_name, versions in spec.items()
            for version in versions
            for package in _get_packages(version, package_groups[pg_name])]


parser = _build_parser()


def main(args=None):
    args = parser.parse_args(args or sys.argv[1:])

    spec = _load_json(args.spec)
    package_groups = _load_json(args.packages)
    separator = args.separator

    package_versions = _get_package_versions(spec, package_groups)
    package_format = "%s" + separator + "%s\n"
    package_versions = map(lambda pv: package_format % pv, package_versions)

    sys.stdout.writelines(package_versions)


if __name__ == "__main__":
    main()
