#!/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', encoding='utf-8') 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:])
