# Copyright 2017 The Bazel Authors. All rights reserved.
#
# 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.
"""Generate a Skylark file containing a map of hash of bazel installers."""

import gflags
import urllib2
import sys

_URL_FORMAT = "http://releases.bazel.build/{version}/release/bazel-{version}-without-jdk-installer-{platform}.sh.sha256"
_URL_EXISTS = "http://releases.bazel.build/{version}/release/index.html"

gflags.DEFINE_string("output", "bazel_hash_dict.bzl", "The output file")

gflags.DEFINE_string("map_name", "BAZEL_HASH_DICT",
                     "The name of the generated map in the output file")

gflags.DEFINE_multistring("platforms", ["darwin-x86_64", "linux-x86_64"],
                          "List of platforms to download SHA-256.")

gflags.DEFINE_string("minimum_version", "0.5.0",
                     "The lowest version of Bazel supported")

FLAGS = gflags.FLAGS


def get_hash_map(f):
    """Construct the hash map reading the release website, writing it to f."""
    splitted_version = FLAGS.minimum_version.split(".")
    if len(splitted_version) != 3:
        sys.stderr.write(("Invalid version '%s', "
                          "expected a dot-separated version with 3 components "
                          "(e.g. 3.1.2)") % FLAGS.minimum_version)
        sys.exit(-1)
    version = [
        int(splitted_version[0]),
        int(splitted_version[1]),
        int(splitted_version[2])
    ]
    while True:
        try:
            v = "%s.%s.%s" % (version[0], version[1], version[2])
            print "Getting SHA-256 for version " + v
            # Force 404 before we actually add the information
            urllib2.urlopen(_URL_EXISTS.format(version=v)).read()
            f.write("    '%s': {\n" % v)
            for platform in FLAGS.platforms:
                r = urllib2.urlopen(
                    _URL_FORMAT.format(version=v, platform=platform))
                f.write("        '%s': '%s',\n" % (platform,
                                                   r.read().split(" ", 1)[0]))
            f.write("    },\n")
            version[2] += 1
        except urllib2.HTTPError as e:
            if e.code == 404:
                print "  ==> Not a Bazel version"
                # Current version does not exists, increase the lowest non null version number
                if version[2] == 0:
                    if version[1] == 0:
                        return
                    version[1] = 0
                    version[0] += 1
                else:
                    version[2] = 0
                    version[1] += 1
            else:
                raise e


def print_command_line(f):
    """Print the current command line."""
    f.write("create_hash_dict")
    for i in range(1, len(sys.argv)):
        f.write(" '%s'" % (sys.argv[i].replace("'", "'\\''")))


def main(unused_argv):
    with open(FLAGS.output, "w") as f:
        f.write("# Automatically generated by ")
        print_command_line(f)
        f.write("\n\n%s = {\n" % FLAGS.map_name)
        get_hash_map(f)
        f.write("}\n")


if __name__ == "__main__":
    main(FLAGS(sys.argv))
