#!/usr/bin/env python3
# Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import utils
if utils.is_python3():
  from html.parser import HTMLParser
  import urllib.request
  url_request = urllib.request
else:
  from HTMLParser import HTMLParser
  import urllib
  url_request = urllib
import os
import sys

JETBRAINS_KOTLIN_MAVEN_URL = "https://maven.pkg.jetbrains.space/kotlin/p/" \
                             "kotlin/bootstrap/org/jetbrains/kotlin/"
KOTLIN_RELEASE_URL = JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-compiler/"

def download_newest():
  response = url_request.urlopen(KOTLIN_RELEASE_URL)
  if response.getcode() != 200:
    raise Exception('Url: %s \n returned %s'
                    % (KOTLIN_RELEASE_URL, response.getcode()))
  content = str(response.read())
  release_candidates = []

  class HTMLContentParser(HTMLParser):
    def handle_data(self, data):
      if ('-dev-' in data):
        release_candidates.append(data)

  parser = HTMLContentParser()
  parser.feed(content)

  top_most_version = (0, 0, 0, 0)
  top_most_version_and_build = None

  for version in release_candidates:
    # The compiler version is on the form <major>.<minor>.<revision>-dev-<build>/
    version = version.replace('/', '')
    version_build_args = version.split('-')
    version_components = version_build_args[0].split('.')
    version_components.append(version_build_args[2])
    current_version = tuple(map(int, version_components))
    if (current_version > top_most_version):
      top_most_version = current_version
      top_most_version_and_build = version

  if (top_most_version_and_build is None):
      raise Exception('Url: %s \n returned %s'
                      % (KOTLIN_RELEASE_URL, response.getcode()))

  # We can now download all files related to the kotlin compiler version.
  print("Downloading version: " + top_most_version_and_build)

  kotlinc_lib = os.path.join(
      utils.THIRD_PARTY, "kotlin", "kotlin-compiler-dev", "kotlinc", "lib")

  utils.DownloadFromGoogleCloudStorage(
      os.path.join(
          utils.THIRD_PARTY, "kotlin", "kotlin-compiler-dev.tar.gz.sha1"))

  download_and_save(
      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-compiler/{0}/kotlin-compiler-{0}.jar"
      .format(top_most_version_and_build), kotlinc_lib, "kotlin-compiler.jar")
  download_and_save(
      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-stdlib/{0}/kotlin-stdlib-{0}.jar"
      .format(top_most_version_and_build), kotlinc_lib, "kotlin-stdlib.jar")
  download_and_save(
      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-reflect/{0}/kotlin-reflect-{0}.jar"
      .format(top_most_version_and_build), kotlinc_lib, "kotlin-reflect.jar")


def download_and_save(url, path, name):
  print('Downloading: ' + url)
  url_request.urlretrieve(url, os.path.join(path, name))


if __name__ == '__main__':
  sys.exit(download_newest())

