#!/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 html.parser import HTMLParser
import os
import sys
import urllib.request
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.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)
  urllib.request.urlretrieve(url, os.path.join(path, name))


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

