#!/usr/bin/env python3
# Copyright (c) 2024, 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
import shutil
import sys
import utils


def parse_options():
    parser = argparse.ArgumentParser(description='Release r8')
    parser.add_argument('--sdk-home',
                        '--sdk_home',
                        metavar=('<SDK_HOME>'),
                        help='SDK_HOME to use for finding SDK')
    parser.add_argument('--sdk-name',
                        '--sdk_name',
                        required=True,
                        metavar=('<name>'),
                        help='Name of the SDK, either API level or code name')
    parser.add_argument('--api-level',
                        '--api_level',
                        metavar=('<level>'),
                        help='API level to add this as in third_party')
    return parser.parse_args()


def remove(path):
    try:
        os.remove(path)
    except FileNotFoundError:
        pass


def generate_readme_google(destination, sdk_name):
    with open(os.path.join(destination, 'README.google'), 'w') as f:
        f.write('Name: Android SDK excerpts\n')
        f.write('URL: https://developer.android.com/tools/sdkmanager\n')
        f.write('Version: API version %s\n' % sdk_name)
        f.write('Revision: N/A\n')
        f.write('License: Apache License Version 2.0\n')
        f.write('\n')
        f.write('Description:\n')
        f.write('This is excerpts from an Android SDK including android.jar.\n')


def main():
    args = parse_options()

    if not args.sdk_home:
        args.sdk_home = os.environ.get('SDK_HOME')
        if not args.sdk_home:
            print('No SDK_HOME specified')
            sys.exit(1)
        else:
            print('Using SDK_HOME: %s' % args.sdk_home)

    source = os.path.join(args.sdk_home, 'platforms',
                          'android-%s' % args.sdk_name)
    if not os.path.exists(source):
        print('Path %s does not exist' % source)
        sys.exit(1)

    api_level = args.api_level if args.api_level else args.sdk_name
    api_level_major = -1
    api_level_minor = 0
    try:
        api_level_parts = api_level.split('.')
        if len(api_level_parts) > 2:
            print('API level "%s" must be minor[.major]' % api_level)
            return -1

        api_level_major = int(api_level_parts[0])
        if len(api_level_parts) == 2:
            api_level_minor = int(api_level_parts[1])
    except:
        print('API level "%s" must be minor[.major]' % api_level)
        return -1

    destination = utils.get_android_jar_dir(api_level_major, api_level_minor)

    # Remove existing if present.
    shutil.rmtree(destination, ignore_errors=True)
    remove(destination + 'tar.gz')
    remove(destination + 'tar.gz.sha1')

    # Copy the files of interest.
    destination_optional_path = os.path.join(destination, 'optional')
    os.makedirs(os.path.join(destination_optional_path))
    shutil.copyfile(os.path.join(source, 'android.jar'),
                    os.path.join(destination, 'android.jar'))
    shutil.copyfile(os.path.join(source, 'data', 'api-versions.xml'),
                    os.path.join(destination, 'api-versions.xml'))
    source_optional_path = os.path.join(source, 'optional')
    for root, dirnames, filenames in os.walk(source_optional_path):
        for filename in filenames:
            if filename.endswith('.jar') or filename == 'optional.json':
                shutil.copyfile(
                    os.path.join(source_optional_path, filename),
                    os.path.join(destination_optional_path, filename))
    generate_readme_google(destination, args.sdk_name)

    print('If you want to upload this run:')
    print('  (cd %s; upload_to_google_storage.py -a --bucket r8-deps %s)' %
          (os.path.dirname(destination), os.path.basename(destination)))
    print('Update d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt'
          ' if this is a new dependency.')
    print('Run main method in AndroidApiHashingDatabaseBuilderGeneratorTest'
        ' to generate the API database.')


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