# 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("//extensions/features/features.gni")
import("//tools/grit/repack.gni")

# Wraps repack_locales(), setting the source_patterns and deps required for
# Chrome.
#
# Extra Parameters:
#
#   additional_source_patterns [optional]
#      Extra source_patterns for repack_locales().
template("chrome_repack_locales") {
  repack_locales(target_name) {
    forward_variables_from(invoker, "*", [ "additional_source_patterns" ])

    # Each input pak file should also have a deps line.
    source_patterns = [
      "${root_gen_dir}/chrome/generated_resources_",
      "${root_gen_dir}/chrome/locale_settings_",
      "${root_gen_dir}/chrome/platform_locale_settings_",
      "${root_gen_dir}/components/strings/components_locale_settings_",
      "${root_gen_dir}/components/strings/components_strings_",
    ]
    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "//chrome/app:generated_resources",
      "//chrome/app/resources:locale_settings",
      "//chrome/app/resources:platform_locale_settings",
      "//components/strings:components_locale_settings",
      "//components/strings:components_strings",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (use_ash) {
      source_patterns += [ "${root_gen_dir}/ash/common/strings/ash_strings_" ]
      deps += [ "//ash/common/strings" ]
    }
    if (is_chromeos) {
      source_patterns += [
        "${root_gen_dir}/remoting/resources/",
        "${root_gen_dir}/ui/chromeos/strings/ui_chromeos_strings_",
      ]
      deps += [
        "//remoting/resources",
        "//ui/chromeos/strings",
      ]
    }
    if (!is_ios) {
      source_patterns += [
        "${root_gen_dir}/content/app/strings/content_strings_",
        "${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_",
        "${root_gen_dir}/third_party/libaddressinput/address_input_strings_",
        "${root_gen_dir}/ui/strings/app_locale_settings_",
        "${root_gen_dir}/ui/strings/ui_strings_",
      ]
      deps += [
        "//content/app/strings",
        "//device/bluetooth/strings",
        "//third_party/libaddressinput:strings",
        "//ui/strings:app_locale_settings",
        "//ui/strings:ui_strings",
      ]
    }
    if (is_android) {
      source_patterns += [
        "${root_gen_dir}/blimp/client/public/resources/blimp_strings_",
        "${root_gen_dir}/blimp/client/support/resources/blimp_strings_",
      ]
      deps += [
        "//blimp/client/public/resources",
        "//blimp/client/support/resources:strings",
      ]
    }
    if (enable_extensions) {
      source_patterns +=
          [ "${root_gen_dir}/extensions/strings/extensions_strings_" ]
      deps += [ "//extensions/strings" ]
    }

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

    if (defined(invoker.additional_source_patterns)) {
      source_patterns += invoker.additional_source_patterns
    }
  }
}
