#!/usr/bin/env python
# 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.

from HTMLParser import HTMLParser
import os
import sys
import urllib
import utils

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 = urllib.urlopen(KOTLIN_RELEASE_URL)
  if response.getcode() != 200:
    raise Exception('Url: %s \n returned %s'
                    % (KOTLIN_RELEASE_URL, response.getcode()))
  content = 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)
  urllib.urlretrieve(url, os.path.join(path, name))


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

