# 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/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/platform_locale_settings_${locale}.pak",
      "${root_gen_dir}/chrome/generated_resources_${locale}.pak",
      "${root_gen_dir}/chrome/locale_settings_${locale}.pak",
      "${root_gen_dir}/components/strings/components_strings_${locale}.pak",
    ]
    deps = [
      "//chrome/app/resources:platform_locale_settings",
      "//chrome/app:generated_resources",
      "//chrome/app/resources:locale_settings",
      "//components/strings",
    ]

    if (use_ash) {
      sources += [ "${root_gen_dir}/ash/strings/ash_strings_${locale}.pak" ]
      deps += [ "//ash/strings" ]
    }
    if (is_chromeos) {
      sources += [
        "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_${locale}.pak",
        "${root_gen_dir}/remoting/resources/${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}/ui/strings/ui_strings_${locale}.pak",
        "${root_gen_dir}/ui/strings/app_locale_settings_${locale}.pak",
      ]
      deps += [
        "//content/app/strings",
        "//ui/strings:ui_strings",
        "//ui/strings:app_locale_settings",
      ]
    }
    if (enable_autofill_dialog && !is_ios && !is_android) {
      sources += [ "${root_gen_dir}/third_party/libaddressinput/address_input_strings_${locale}.pak" ]
      deps += [ "//third_party/libaddressinput:strings" ]
    }
    if (enable_extensions) {
      sources += [
        "${root_gen_dir}/device/bluetooth/device_bluetooth_strings_${locale}.pak",

        # 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 += [
        "//device/bluetooth:strings",
        "//extensions/strings",
      ]
    }

    if (is_chrome_branded) {
      sources +=
          [ "${root_gen_dir}/chrome/google_chrome_strings_${locale}.pak" ]
      deps += [ "//chrome/app:google_chrome_strings" ]
    } else {
      sources += [ "${root_gen_dir}/chrome/chromium_strings_${locale}.pak" ]
      deps += [ "//chrome/app: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) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }
    deps = locale_targets
  }
}
