#!/usr/bin/env python3
# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Wrapper script around TraceEventAdder script."""

import argparse
import logging
import sys
import tempfile
import os

from util import build_utils
import action_helpers  # build_utils adds //build to sys.path.


# The real limit is generally >100kb, but 10k seems like a reasonable "it's big"
# threshold.
_MAX_CMDLINE = 10000


def main(argv):
    build_utils.InitLogging('TRACE_EVENT_REWRITER_DEBUG')
    argv = build_utils.ExpandFileArgs(argv[1:])
    parser = argparse.ArgumentParser()
    action_helpers.add_depfile_arg(parser)
    parser.add_argument(
        '--script',
        required=True,
        help='Path to the java binary wrapper script.',
    )
    parser.add_argument('--stamp', help='Path to stamp to mark when finished.')
    parser.add_argument('--classpath', action='append', nargs='+')
    parser.add_argument('--input-jars', action='append', nargs='+')
    parser.add_argument('--output-jars', action='append', nargs='+')
    args = parser.parse_args(argv)

    args.classpath = action_helpers.parse_gn_list(args.classpath)
    args.input_jars = action_helpers.parse_gn_list(args.input_jars)
    args.output_jars = action_helpers.parse_gn_list(args.output_jars)

    for output_jar in args.output_jars:
        jar_dir = os.path.dirname(output_jar)
        if not os.path.exists(jar_dir):
            os.makedirs(jar_dir)

    cmd = [
        args.script,
        '--classpath',
        ':'.join(args.classpath),
        ':'.join(args.input_jars),
        ':'.join(args.output_jars),
    ]
    if sum(len(x) for x in cmd) > _MAX_CMDLINE:
        # Cannot put --classpath in the args file because that is consumed by the
        # wrapper script. Keep the args file on disk when debugging.
        is_debug = logging.getLogger().isEnabledFor(logging.DEBUG)
        args_file = tempfile.NamedTemporaryFile(mode='w', delete=not is_debug)
        args_file.write('\n'.join(cmd[3:]))
        args_file.flush()
        cmd[3:] = ['@' + args_file.name]

    logging.debug(' '.join(cmd))

    build_utils.CheckOutput(cmd, print_stdout=True)

    build_utils.Touch(args.stamp)

    all_input_jars = args.input_jars + args.classpath
    action_helpers.write_depfile(
        args.depfile, args.stamp, inputs=all_input_jars
    )


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