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

import gradle
import jdk
import utils


def parse_options(argv):
    parser = argparse.ArgumentParser(
        description='Print unique strings in APK string pools.')
    parser.add_argument('apk', help='Path to the APK to analyze')
    parser.add_argument('--no-build',
                        '--no_build',
                        help='Run without building first (default false)',
                        default=False,
                        action='store_true')
    return parser.parse_args(argv)


def main(argv):
    options = parse_options(argv)

    if not options.no_build:
        gradle.run_gradle(['r8', ':tools:jar'])

    if not os.path.exists(utils.R8_JAR):
        print(
            f"Error: Could not find {utils.R8_JAR}. Build failed or --no-build was specified incorrectly."
        )
        return 1
    if not os.path.exists(utils.TOOLS_JAR):
        print(
            f"Error: Could not find {utils.TOOLS_JAR}. Build failed or --no-build was specified incorrectly."
        )
        return 1

    java = jdk.GetJavaExecutable(jdk.GetDefaultJdkHome())
    classpath = [utils.TOOLS_JAR, utils.R8_JAR]

    cmd = [
        java, '-cp',
        os.pathsep.join(classpath),
        'com.android.tools.r8.tools.dex.StringConstantPoolPrinter', options.apk
    ]

    res = subprocess.run(cmd)
    return res.returncode


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
