#!/usr/bin/env python3
# Copyright (c) 2023, 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
import os.path
import subprocess
import shutil
import sys

import utils

REPOSITORIES = [
  'Maven Central=https://repo1.maven.org/maven2/',
  'Google=https://maven.google.com/',
  "Gradle Plugins=https://plugins.gradle.org/m2/",
]

ANDRDID_SUPPORT_VERSION = '25.4.0'
ASM_VERSION = '9.5'
ESPRESSO_VERSION = '3.0.0'
FASTUTIL_VERSION = '7.2.1'
KOTLIN_METADATA_VERSION = '0.6.2'
KOTLIN_VERSION = '1.8.0'
GUAVA_VERSION = '31.1-jre'
GUAVA_VERSION_NEW = '32.1.2-jre'
GSON_VERSION = '2.10.1'
JAVASSIST_VERSION = '3.29.2-GA'
JUNIT_VERSION = '4.13-beta-2'
MOCKITO_VERSION = '2.10.0'
SMALI_VERSION = '3.0.3'
ERROR_PRONE_VERSION = '2.18.0'
TESTNG_VERSION = '6.10'

# Resource shrinker dependency versions
AAPT2_PROTO_VERSION = '8.2.0-alpha10-10154469'
PROTOBUF_VERSION = '3.19.3'
STUDIO_SDK_VERSION = '31.2.0-alpha10'

BUILD_DEPENDENCIES = [
  'com.google.code.gson:gson:{version}'.format(version = GSON_VERSION),
  'com.google.guava:guava:{version}'.format(version = GUAVA_VERSION),
  'it.unimi.dsi:fastutil:{version}'.format(version = FASTUTIL_VERSION),
  'org.jetbrains.kotlinx:kotlinx-metadata-jvm:{version}'.format(version = KOTLIN_METADATA_VERSION),
  'org.ow2.asm:asm:{version}'.format(version = ASM_VERSION),
  'org.ow2.asm:asm-util:{version}'.format(version = ASM_VERSION),
  'org.ow2.asm:asm-commons:{version}'.format(version = ASM_VERSION),
]

TEST_DEPENDENCIES = [
  'junit:junit:{version}'.format(version = JUNIT_VERSION),
  'com.android.support:support-v4:{version}'.format(version = ANDRDID_SUPPORT_VERSION),
  'com.android.support.test.espresso:espresso-core:{version}'.format(version = ESPRESSO_VERSION),
  'com.android.tools.smali:smali:{version}'.format(version = SMALI_VERSION),
  'com.google.errorprone:error_prone_core:{version}'.format(version = ERROR_PRONE_VERSION),
  'org.javassist:javassist:{version}'.format(version = JAVASSIST_VERSION),
  'org.jetbrains.kotlin:kotlin-stdlib:{version}'.format(version = KOTLIN_VERSION),
  'org.jetbrains.kotlin:kotlin-reflect:{version}'.format(version = KOTLIN_VERSION),
  'org.mockito:mockito-core:{version}'.format(version = MOCKITO_VERSION),
  'org.testng:testng:{version}'.format(version = TESTNG_VERSION),
]

NEW_DEPENDENCIES = [
  'com.google.guava:guava:{version}'.format(version = GUAVA_VERSION_NEW),
  'org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.0.6',
  'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.8.10',
  'org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.8.10',
  'org.jetbrains.kotlin:kotlin-reflect:1.6.10',
  'org.jetbrains.kotlin:kotlin-reflect:1.8.10',
  'org.jetbrains.kotlin:kotlin-script-runtime:1.8.10',
  'org.jetbrains.kotlin:kotlin-tooling-core:1.8.10',
  'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:3.0.1',

  # Resource shrinker
  'com.android.tools.build:aapt2-proto:{version}'.format(version = AAPT2_PROTO_VERSION),
  'com.android.tools.layoutlib:layoutlib-api:{version}'.format(version = STUDIO_SDK_VERSION),
  'com.android.tools:common:{version}'.format(version = STUDIO_SDK_VERSION),
  'com.android.tools:sdk-common:{version}'.format(version = STUDIO_SDK_VERSION),
  'com.google.protobuf:protobuf-java:{version}'.format(version = PROTOBUF_VERSION),
]

def dependencies_tar(dependencies_path):
  return os.path.join(
      os.path.dirname(dependencies_path),
      os.path.basename(dependencies_path) + '.tar.gz')

def dependencies_tar_sha1(dependencies_path):
  return os.path.join(
      os.path.dirname(dependencies_path),
      os.path.basename(dependencies_path) + '.tar.gz.sha1')

def remove_local_maven_repository(dependencies_path):
  if os.path.exists(dependencies_path):
    shutil.rmtree(dependencies_path)
  tar = dependencies_tar(dependencies_path)
  if os.path.exists(tar):
    os.remove(tar)
  sha1 = dependencies_tar_sha1(dependencies_path)
  if os.path.exists(sha1):
    os.remove(sha1)

def create_local_maven_repository(args, dependencies_path, repositories, dependencies):
  with utils.ChangedWorkingDirectory(args.studio):
    cmd = [
        os.path.join('tools', 'base', 'bazel', 'bazel'),
        'run',
        '//tools/base/bazel:local_maven_repository_generator_cli',
        '--',
        '--repo-path',
        dependencies_path,
        '--fetch']
    for repository in repositories:
      cmd.extend(['--remote-repo', repository])
    for dependency in dependencies:
      cmd.append(dependency)
    subprocess.check_call(cmd)

def parse_options():
  result = argparse.ArgumentParser(
      description='Create local Maven repository woth dependencies')
  result.add_argument('--studio',
                      metavar=('<path>'),
                      required=True,
                      help='Path to a studio-main checkout (to get the tool '
                          '//tools/base/bazel:local_maven_repository_generator_cli)')
  return result.parse_args()


def main():
  args = parse_options()

  dependencies_path = os.path.join(utils.THIRD_PARTY, 'dependencies')
  print("Downloading to " + dependencies_path)
  remove_local_maven_repository(dependencies_path)
  create_local_maven_repository(
      args, dependencies_path, REPOSITORIES, BUILD_DEPENDENCIES + TEST_DEPENDENCIES)

  dependencies_new_path = os.path.join(utils.THIRD_PARTY, 'dependencies_new')
  print("Downloading to " + dependencies_new_path)
  remove_local_maven_repository(dependencies_new_path)
  create_local_maven_repository(
      args, dependencies_new_path, REPOSITORIES, NEW_DEPENDENCIES)

  print("Uploading to Google Cloud Storage:")
  with utils.ChangedWorkingDirectory(utils.THIRD_PARTY):
    for dependency in ['dependencies', 'dependencies_new']:
      cmd = [
          'upload_to_google_storage.py',
          '-a',
          '--bucket',
          'r8-deps',
          dependency]
      subprocess.check_call(cmd)

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