#!/usr/bin/env python3
#
# Copyright 2013 The Chromium Authors
# 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 posixpath
import re
import sys
import zipfile

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


def _ParsePackageName(data):
  m = re.match(r'^\s*package\s+(.*?)\s*;', data, re.MULTILINE)
  return m.group(1) if m else ''


def main(args):
  args = build_utils.ExpandFileArgs(args)

  parser = argparse.ArgumentParser()
  parser.add_argument('--include-dirs', help='GN list of include directories.')
  parser.add_argument('--output', help='Path for .srcjar.')
  parser.add_argument('--define',
                      action='append',
                      dest='defines',
                      help='List of -D args')
  parser.add_argument('templates', nargs='+', help='Template files.')
  options = parser.parse_args(args)

  options.defines = action_helpers.parse_gn_list(options.defines)
  options.include_dirs = action_helpers.parse_gn_list(options.include_dirs)

  gcc_cmd = [
      'gcc',
      '-E',  # stop after preprocessing.
      '-DANDROID',  # Specify ANDROID define for pre-processor.
      '-x',
      'c-header',  # treat sources as C header files
      '-P',  # disable line markers, i.e. '#line 309'
  ]
  gcc_cmd.extend('-D' + x for x in options.defines)
  gcc_cmd.extend('-I' + x for x in options.include_dirs)

  with action_helpers.atomic_output(options.output) as f:
    with zipfile.ZipFile(f, 'w') as z:
      for template in options.templates:
        data = build_utils.CheckOutput(gcc_cmd + [template])
        package_name = _ParsePackageName(data)
        if not package_name:
          raise Exception('Could not find java package of ' + template)
        zip_path = posixpath.join(
            package_name.replace('.', '/'),
            os.path.splitext(os.path.basename(template))[0]) + '.java'
        zip_helpers.add_to_zip_hermetic(z, zip_path, data=data)


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