#!/usr/bin/env python
#
# Copyright (c) 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Generate ResourceRewriter.java which overwrites the given package's
   resource id.
"""

import argparse
import os
import sys
import zipfile

from util import build_utils

# Import jinja2 from third_party/jinja2
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
                                             '..',
                                             '..',
                                             '..',
                                             'third_party')))
import jinja2


RESOURCE_REWRITER_JAVA="ResourceRewriter.java"

RESOURCE_REWRITER="""/* AUTO-GENERATED FILE.  DO NOT MODIFY. */

package {{ package }};
/**
 * Helper class used to fix up resource ids.
 */
class ResourceRewriter {
    /**
     * Rewrite the R 'constants' for the WebView.
     */
    public static void rewriteRValues(final int packageId) {
        {% for res_package in res_packages %}
        {{ res_package }}.R.onResourcesLoaded(packageId);
        {% endfor %}
    }
}
"""

def ParseArgs(args):
  """Parses command line options.

  Returns:
    An Namespace from argparse.parse_args()
  """
  parser = argparse.ArgumentParser(prog='generate_resource_rewriter')

  parser.add_argument('--package-name',
                      required=True,
                      help='The package name of ResourceRewriter.')
  parser.add_argument('--dep-packages',
                      required=True,
                      help='A list of packages whose resource id will be'
                           'overwritten in ResourceRewriter.')
  parser.add_argument('--output-dir',
                      help='A output directory of generated'
                           ' ResourceRewriter.java')
  parser.add_argument('--srcjar',
                      help='The path of generated srcjar which has'
                           ' ResourceRewriter.java')

  return parser.parse_args(args)


def CreateResourceRewriter(package, res_packages, output_dir):
  build_utils.MakeDirectory(output_dir)
  java_path = os.path.join(output_dir, RESOURCE_REWRITER_JAVA)
  template = jinja2.Template(RESOURCE_REWRITER,
                             trim_blocks=True,
                             lstrip_blocks=True)
  output = template.render(package=package, res_packages=res_packages)
  with open(java_path, 'w') as f:
    f.write(output)

def CreateResourceRewriterSrcjar(package, res_packages, srcjar_path):
  with build_utils.TempDir() as temp_dir:
    output_dir = os.path.join(temp_dir, *package.split('.'))
    CreateResourceRewriter(package, res_packages, output_dir)
    build_utils.DoZip([os.path.join(output_dir, RESOURCE_REWRITER_JAVA)],
                      srcjar_path,
                      temp_dir)


def main():
  options = ParseArgs(build_utils.ExpandFileArgs(sys.argv[1:]))
  package = options.package_name
  if options.output_dir:
    output_dir = os.path.join(options.output_dir, *package.split('.'))
    CreateResourceRewriter(
        package,
        build_utils.ParseGypList(options.dep_packages),
        output_dir)
  else:
    CreateResourceRewriterSrcjar(
        package,
        build_utils.ParseGypList(options.dep_packages),
        options.srcjar)

  return 0

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

