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

# Generates a Java file with API keys.

import argparse
import os
import string
import sys
import zipfile

from util import build_utils
import zip_helpers

sys.path.append(
    os.path.abspath(os.path.join(sys.path[0], '../../../google_apis')))
import google_api_keys


PACKAGE = 'org.chromium.chrome'
CLASSNAME = 'GoogleAPIKeys'


def GetScriptName():
  return os.path.relpath(__file__, build_utils.DIR_SOURCE_ROOT)


def GenerateOutput(constant_definitions):
  template = string.Template("""
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file is autogenerated by
//     ${SCRIPT_NAME}
// From
//     ${SOURCE_PATH}

package ${PACKAGE};

public class ${CLASS_NAME} {
${CONSTANT_ENTRIES}
}
""")

  constant_template = string.Template(
      '  public static final String ${NAME} = "${VALUE}";')
  constant_entries_list = []
  for constant_name, constant_value in constant_definitions.items():
    values = {
        'NAME': constant_name,
        'VALUE': constant_value,
    }
    constant_entries_list.append(constant_template.substitute(values))
  constant_entries_string = '\n'.join(constant_entries_list)

  values = {
      'CLASS_NAME': CLASSNAME,
      'CONSTANT_ENTRIES': constant_entries_string,
      'PACKAGE': PACKAGE,
      'SCRIPT_NAME': GetScriptName(),
      'SOURCE_PATH': 'google_api_keys/google_api_keys.h',
  }
  return template.substitute(values)


def _DoWriteJavaOutput(output_path, constant_definition):
  folder = os.path.dirname(output_path)
  if folder and not os.path.exists(folder):
    os.makedirs(folder)
  with open(output_path, 'w') as out_file:
    out_file.write(GenerateOutput(constant_definition))


def _DoWriteJarOutput(output_path, constant_definition):
  folder = os.path.dirname(output_path)
  if folder and not os.path.exists(folder):
    os.makedirs(folder)
  with zipfile.ZipFile(output_path, 'w') as srcjar:
    path = '%s/%s' % (PACKAGE.replace('.', '/'), CLASSNAME + '.java')
    data = GenerateOutput(constant_definition)
    zip_helpers.add_to_zip_hermetic(srcjar, path, data=data)


def _DoMain(argv):
  parser = argparse.ArgumentParser()
  parser.add_argument("--out", help="Path for java output.")
  parser.add_argument("--srcjar", help="Path for srcjar output.")
  options = parser.parse_args(argv)
  if not options.out and not options.srcjar:
    parser.print_help()
    sys.exit(-1)

  values = {}
  values['GOOGLE_API_KEY'] = google_api_keys.GetAPIKey()
  values['GOOGLE_API_KEY_ANDROID_NON_STABLE'] = (
      google_api_keys.GetAPIKeyAndroidNonStable())
  values['GOOGLE_CLIENT_ID_MAIN'] = google_api_keys.GetClientID('MAIN')
  values['GOOGLE_CLIENT_SECRET_MAIN'] = google_api_keys.GetClientSecret('MAIN')
  values['GOOGLE_CLIENT_ID_REMOTING'] = google_api_keys.GetClientID('REMOTING')
  values['GOOGLE_CLIENT_SECRET_REMOTING'] = google_api_keys.GetClientSecret(
      'REMOTING')
  values['GOOGLE_CLIENT_ID_REMOTING_HOST'] = google_api_keys.GetClientID(
      'REMOTING_HOST')
  values['GOOGLE_CLIENT_SECRET_REMOTING_HOST'] = (google_api_keys.
      GetClientSecret('REMOTING_HOST'))

  if options.out:
    _DoWriteJavaOutput(options.out, values)
  if options.srcjar:
    _DoWriteJarOutput(options.srcjar, values)


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