#!/usr/bin/env python3
# Copyright (c) 2022, 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 argparse
from enum import Enum
import os
from os.path import join
import shutil
import subprocess
import sys
import urllib.request

import gradle
import utils
import create_maven_release
import archive_desugar_jdk_libs

class Variant(Enum):
    jdk8 = 'jdk8'
    jdk11_legacy = 'jdk11_legacy'
    jdk11_minimal = 'jdk11_minimal'
    jdk11 = 'jdk11'
    jdk11_nio = 'jdk11_nio'

    def __str__(self):
        return self.value

def parse_options():
  parser = argparse.ArgumentParser(
    description='Local desugared library repository for desugared library configurations')
  parser.add_argument('--repo-root', '--repo_root',
                      default='/tmp/repo',
                      metavar=('<path>'),
                      help='Location for Maven repository.')
  parser.add_argument('--clear-repo', '--clear_repo',
                      default=False,
                      action='store_true',
                      help='Clear the Maven repository so it only has one version present')
  parser.add_argument('--variant', type=Variant, choices=list(Variant))
  parser.add_argument('--desugar-jdk-libs-checkout', '--desugar_jdk_libs_checkout',
                      default=None,
                      metavar=('<path>'),
                      help='Use existing checkout of github.com/google/desugar_jdk_libs.')
  parser.add_argument('--desugar-jdk-libs-revision', '--desugar_jdk_libs_revision',
                      default=None,
                      metavar=('<revision>'),
                      help='Revision of github.com/google/desugar_jdk_libs to use.')
  parser.add_argument('--release-version', '--release_version',
                      metavar=('<version>'),
                      help='The desugared library release version to use. This will pull from the archived releases')
  args = parser.parse_args()
  return args

def jar_or_pom_file(unzip_dir, artifact, version, extension):
  return join(
      unzip_dir,
      'com',
      'android',
      'tools',
      artifact,
      version,
      artifact + '-' + version + '.' + extension)

def jar_file(unzip_dir, artifact, version):
  return jar_or_pom_file(unzip_dir, artifact, version, 'jar')

def pom_file(unzip_dir, artifact, version):
  return jar_or_pom_file(unzip_dir, artifact, version, 'pom')

def run(args):
  artifact = None
  configuration_artifact = None
  configuration = None
  conversions = None
  implementation = None
  version_file = None
  implementation_build_target = None
  implementation_maven_zip = None
  release_archive_location = None
  match args.variant:
    case Variant.jdk8:
      artifact = 'desugar_jdk_libs'
      configuration_artifact = 'desugar_jdk_libs_configuration'
      configuration = utils.DESUGAR_CONFIGURATION
      conversions = utils.LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP
      implementation = utils.DESUGAR_IMPLEMENTATION
      version_file = 'VERSION.txt'
      implementation_build_target = ':maven_release'
      implementation_maven_zip = 'desugar_jdk_libs.zip'
      release_archive_location = 'desugar_jdk_libs'
    case Variant.jdk11_legacy:
      artifact = 'desugar_jdk_libs'
      configuration_artifact = 'desugar_jdk_libs_configuration'
      configuration = utils.DESUGAR_CONFIGURATION_JDK11_LEGACY
      conversions = utils.LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP
      implementation = utils.DESUGAR_IMPLEMENTATION_JDK11
      version_file = 'VERSION_JDK11_LEGACY.txt'
      implementation_build_target = ':maven_release_jdk11_legacy'
      implementation_maven_zip = 'desugar_jdk_libs_jdk11_legacy.zip'
      release_archive_location = 'desugar_jdk_libs'
    case Variant.jdk11_minimal:
      artifact = 'desugar_jdk_libs_minimal'
      configuration_artifact = 'desugar_jdk_libs_configuration_minimal'
      configuration = utils.DESUGAR_CONFIGURATION_JDK11_MINIMAL
      conversions = utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP
      implementation = utils.DESUGAR_IMPLEMENTATION_JDK11
      version_file = 'VERSION_JDK11_MINIMAL.txt'
      implementation_build_target = ':maven_release_jdk11_minimal'
      implementation_maven_zip = 'desugar_jdk_libs_jdk11_minimal.zip'
      release_archive_location = 'desugar_jdk_libs_minimal'
    case Variant.jdk11:
      artifact = 'desugar_jdk_libs'
      configuration_artifact = 'desugar_jdk_libs_configuration'
      configuration = utils.DESUGAR_CONFIGURATION_JDK11
      conversions = utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP
      implementation = utils.DESUGAR_IMPLEMENTATION_JDK11
      version_file = 'VERSION_JDK11.txt'
      implementation_build_target = ':maven_release_jdk11'
      implementation_maven_zip = 'desugar_jdk_libs_jdk11.zip'
      release_archive_location = 'desugar_jdk_libs'
    case Variant.jdk11_nio:
      artifact = 'desugar_jdk_libs_nio'
      configuration_artifact = 'desugar_jdk_libs_configuration_nio'
      configuration = utils.DESUGAR_CONFIGURATION_JDK11_NIO
      conversions = utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP
      implementation = utils.DESUGAR_IMPLEMENTATION_JDK11
      version_file = 'VERSION_JDK11_NIO.txt'
      implementation_build_target = ':maven_release_jdk11_nio'
      implementation_maven_zip = 'desugar_jdk_libs_jdk11_nio.zip'
      release_archive_location = 'desugar_jdk_libs_nio'
  implementation_build_output = join('bazel-bin', implementation_maven_zip)
  gradle.RunGradle([utils.R8])
  with utils.TempDir() as tmp_dir:
    (name, configuration_version) = utils.desugar_configuration_name_and_version(configuration, False)
    if (args.release_version != None and args.release_version != configuration_version):
      raise Exception(
          'Configuration version %s is different for specified version %s'
          % (configuration_version, version))
    version = configuration_version
    print("Name: %s" % name)
    print("Version: %s" % version)
    # Checkout desugar_jdk_libs from GitHub
    use_existing_checkout = args.desugar_jdk_libs_checkout != None
    checkout_dir = (args.desugar_jdk_libs_checkout
                    if use_existing_checkout
                    else join(tmp_dir, 'desugar_jdk_libs'))
    if (not args.release_version and not use_existing_checkout):
      subprocess.check_call(
          ['git', 'clone', 'https://github.com/google/desugar_jdk_libs.git', checkout_dir])
      if (args.desugar_jdk_libs_revision):
        subprocess.check_call(
            ['git', '-C', checkout_dir, 'checkout', args.desugar_jdk_libs_revision])
      with utils.ChangedWorkingDirectory(checkout_dir):
        with open(version_file) as version_file:
          version_file_lines = version_file.readlines()
          for line in version_file_lines:
            if not line.startswith('#'):
              desugar_jdk_libs_version = line.strip()
              if (version != desugar_jdk_libs_version):
                raise Exception(
                  "Version mismatch. Configuration has version '"
                  + version
                  + "', and desugar_jdk_libs has version '"
                  + desugar_jdk_libs_version
                  + "'")

    # Build desugared library configuration.
    print("Building desugared library configuration " + version)
    maven_zip = join(tmp_dir, 'desugar_configuration.zip')
    create_maven_release.generate_desugar_configuration_maven_zip(
      maven_zip,
      configuration,
      implementation,
      conversions)
    unzip_dir = join(tmp_dir, 'desugar_jdk_libs_configuration_unzipped')
    cmd = ['unzip', '-q', maven_zip, '-d', unzip_dir]
    subprocess.check_call(cmd)
    cmd = [
      'mvn',
      'deploy:deploy-file',
      '-Durl=file:' + args.repo_root,
      '-DrepositoryId=someName',
      '-Dfile=' + jar_file(unzip_dir, configuration_artifact, version),
      '-DpomFile=' + pom_file(unzip_dir, configuration_artifact, version)]
    subprocess.check_call(cmd)

    undesugared_if_needed = None
    if not args.release_version:
      # Build desugared library.
      print("Building desugared library " + version)
      with utils.ChangedWorkingDirectory(checkout_dir):
        subprocess.check_call([
            'bazel',
            '--bazelrc=/dev/null',
            'build',
            '--spawn_strategy=local',
            '--verbose_failures',
            implementation_build_target])

      # Undesugar desugared library if needed.
      undesugared_if_needed = join(checkout_dir, implementation_build_output)
      if (args.variant == Variant.jdk11_minimal
          or args.variant == Variant.jdk11
          or args.variant == Variant.jdk11_nio):
        undesugared_if_needed = join(tmp_dir, 'undesugared.zip')
        archive_desugar_jdk_libs.Undesugar(
          str(args.variant),
          join(checkout_dir, implementation_build_output),
          version,
          undesugared_if_needed)
    else:
      # Download the already built and undesugared library from release archive.
      undesugared_if_needed = join(tmp_dir, implementation_maven_zip)
      urllib.request.urlretrieve(
        ('https://storage.googleapis.com/r8-releases/raw/%s/%s/%s'
            % (release_archive_location, version, implementation_maven_zip)),
        undesugared_if_needed)

    unzip_dir = join(tmp_dir, 'desugar_jdk_libs_unzipped')
    cmd = [
        'unzip',
        '-q',
        undesugared_if_needed,
        '-d',
        unzip_dir]
    subprocess.check_call(cmd)
    cmd = [
      'mvn',
      'deploy:deploy-file',
      '-Durl=file:' + args.repo_root,
      '-DrepositoryId=someName',
      '-Dfile=' + jar_file(unzip_dir, artifact, version),
      '-DpomFile=' + pom_file(unzip_dir, artifact, version)]
    subprocess.check_call(cmd)

    print()
    print("Artifacts:")
    print("  com.android.tools:%s:%s" % (configuration_artifact, version))
    print("  com.android.tools:%s:%s" % (artifact, version))
    print()
    print("deployed to Maven repository at " + args.repo_root + ".")
    print()
    print("Add")
    print()
    print("  maven {")
    print("    url uri('file://" + args.repo_root + "')")
    print("  }")
    print()
    print("to dependencyResolutionManagement.repositories in settings.gradle, and use")
    print('the "changing" property of the coreLibraryDesugaring dependency:')
    print()
    print("  coreLibraryDesugaring('com.android.tools:%s:%s') {" % (artifact, version))
    print("    changing = true")
    print("  }")
    print()
    print('If not using the "changing" propertyRemember to run gradle with '
      + " --refresh-dependencies (./gradlew --refresh-dependencies ...) "
      + "to ensure the cache is not used when the same version is published."
      + "multiple times.")

def main():
  args = parse_options()
  if args.desugar_jdk_libs_checkout and args.release_version:
    raise Exception(
        'Options --desugar-jdk-libs-checkout and --release-version are mutually exclusive')
  if args.desugar_jdk_libs_revision and args.release_version:
    raise Exception(
        'Options --desugar-jdk-libs-revision and --release-version are mutually exclusive')
  if args.desugar_jdk_libs_checkout and args.desugar_jdk_libs_revision:
    raise Exception(
        'Options --desugar-jdk-libs-checkout and --desugar-jdk-libs-revision are mutually exclusive')
  if args.clear_repo:
    shutil.rmtree(args.repo_root, ignore_errors=True)
  utils.makedirs_if_needed(args.repo_root)
  if (args.variant):
    run(args)
  else:
    for v in Variant:
      args.variant = v
      run(args)

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