# Copyright 2014 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.

import("//build/config/chrome_build.gni")
import("//build/config/features.gni")
import("//build/config/ui.gni")
import("//tools/grit/repack.gni")

# Arguments:
#
#   locale
#       Internal name of locale. e.g. "pt-BR"
#
#   output
#       Output file name.
#
#   visibility
#       Normal meaning.
template("_repack_one_locale") {
  locale = invoker.locale

  repack(target_name) {
    visibility = invoker.visibility

    # Each input pak file should also have a deps line for completeness.
    sources = [
      "${root_gen_dir}/chrome/generated_resources_${locale}.pak",
      "${root_gen_dir}/chrome/locale_settings_${locale}.pak",
      "${root_gen_dir}/chrome/platform_locale_settings_${locale}.pak",
      "${root_gen_dir}/components/strings/components_strings_${locale}.pak",
    ]
    deps = [
      "//chrome/app:generated_resources",
      "//chrome/app/resources:locale_settings",
      "//chrome/app/resources:platform_locale_settings",
      "//components/strings:components_strings",
    ]

    # The settings strings are not being treated as strings because they are
    # not translated (English only), this should change in late 2015.
    sources += [ "${root_gen_dir}/chrome/settings_strings.pak" ]
    deps += [ "//chrome/app:settings_strings" ]

    if (use_ash) {
      sources += [ "${root_gen_dir}/ash/strings/ash_strings_${locale}.pak" ]
      deps += [ "//ash/strings" ]
    }
    if (is_chromeos) {
      sources += [
        "${root_gen_dir}/remoting/resources/${locale}.pak",
        "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_${locale}.pak",
      ]
      deps += [
        "//remoting/resources",
        "//ui/chromeos/strings",
      ]
    }
    if (!is_ios) {
      sources += [
        "${root_gen_dir}/content/app/strings/content_strings_${locale}.pak",
        "${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_${locale}.pak",
        "${root_gen_dir}/ui/strings/app_locale_settings_${locale}.pak",
        "${root_gen_dir}/ui/strings/ui_strings_${locale}.pak",
      ]
      deps += [
        "//content/app/strings",
        "//device/bluetooth/strings",
        "//ui/strings:ui_strings",
        "//ui/strings:app_locale_settings",
      ]
    }
    if (enable_autofill_dialog) {
      sources += [ "${root_gen_dir}/third_party/libaddressinput/address_input_strings_${locale}.pak" ]
      deps += [ "//third_party/libaddressinput:strings" ]
    }
    if (enable_extensions) {
      sources += [
        # TODO(jamescook): When Android stops building extensions code move
        # this to the OS != 'ios' and OS != 'android' section.
        "${root_gen_dir}/extensions/strings/extensions_strings_${locale}.pak",
      ]
      deps += [ "//extensions/strings" ]
    }

    if (is_chrome_branded) {
      sources += [
        "${root_gen_dir}/chrome/google_chrome_strings_${locale}.pak",
        "${root_gen_dir}/components/strings/components_google_chrome_strings_${locale}.pak",
      ]
      deps += [
        "//chrome/app:google_chrome_strings",
        "//components/strings:components_google_chrome_strings",
      ]
    } else {
      sources += [
        "${root_gen_dir}/chrome/chromium_strings_${locale}.pak",
        "${root_gen_dir}/components/strings/components_chromium_strings_${locale}.pak",
      ]
      deps += [
        "//chrome/app:chromium_strings",
        "//components/strings:components_chromium_strings",
      ]
    }

    output = invoker.output
  }
}

# Creates an action to call the repack_locales script.
#
# The GYP version generates the locales in the "gen" directory and then copies
# it to the root build directory. This isn't easy to express in a GN copy
# rule since the files on Mac have a complex structure. So we generate the
# files into the final place and skip the "gen" directory.
#
# This template uses GN's looping constructs to avoid the complex call to
# chrome/tools/build/repack_locales.py which wraps the repack commands in the
# GYP build.
#
# Arguments
#
#   input_locales
#       List of locale names to use as inputs.
#
#   output_locales
#       A list containing the corresponding output names for each of the
#       input names. Mac uses different names in some cases.
#
#   visibility
template("chrome_repack_locales") {
  # This is the name of the group below that will collect all the invidual
  # locale targets. External targets will depend on this.
  group_target_name = target_name

  # GN's subscript is too stupid to do invoker.output_locales[foo] so we need
  # to make a copy and do output_locales[foo].
  output_locales = invoker.output_locales

  # Collects all targets the loop generates.
  locale_targets = []

  # This loop iterates over the input locales and also keeps a counter so it
  # can simultaneously iterate over the output locales (using GN's very
  # limited looping capabilities).
  current_index = 0
  foreach(input_locale, invoker.input_locales) {
    output_locale = output_locales[current_index]

    # Compute the name of the target for the current file. Save it for the deps.
    current_name = "${target_name}_${input_locale}"
    locale_targets += [ ":$current_name" ]

    _repack_one_locale(current_name) {
      visibility = [ ":$group_target_name" ]
      locale = input_locale

      # Compute the output name. Mac uses a different location.
      if (is_mac || is_ios) {
        output = "${root_gen_dir}/repack/${output_locale}.lproj/locale.pak"
      } else {
        output = "${root_out_dir}/locales/${output_locale}.pak"
      }
    }

    current_index = current_index + 1
  }

  # The group that external targets depend on which collects all deps.
  group(group_target_name) {
    forward_variables_from(invoker, [ "visibility" ])
    public_deps = locale_targets
  }
}
