# Copyright 2018 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/locales.gni")

# This template defines a rule to generate localized string .rc and .h files
# that can be embedded directly into a library or executable if desired
#
# Parameters
#
#   grd_files_info
#       List of tuples that contains information about the all the .grd files
#       from which to extract the strings.
#       Each tuple contains 4 elements:
#         1. The folder containing the grd file.
#         2. The name of the grd file without an extension.
#         3. The path relative to the grd file where the xtb files are stored.
#         4. The expected locales of the xtb files available in the xtb
#            relative path (can use default_embedded_i18_locales defined in
#            this file). This is just the locale portion of the filename so
#            if a file like google_strings_en-US.xtb is expected then this
#            list should contain "en-US".
#
#   output_file_name_base
#       The base name of the generated header / rc file that will contain the
#       extracted string information. The files will be output to:
#       "$target_gen_dir/$output_file_name_base.h" and
#       "$target_gen_dir/$output_file_name_base.rc".
#
#   first_resource_id (optional)
#       The starting resource ID for the generated string resources.
#       Defaults to 1600.
#
#   extractor_datafile (optional)
#       The python file to execute that contains definition of the specific strings
#       to extract from the source .grd. This file can contain an array STRING_IDS
#       that lists all the IDs that will be extracted for all brand targets.
#       It can optionally also contain a dictionary MODE_SPECIFIC_STRINGS that
#       contains mode specific strings for certain brand targets.
#       MODE_SPECIFIC_STRINGS is only valid if STRING_IDS is specified.
#       Will not be passed to the generation script if it is undefined.
#
#   branding (optional)
#       The branding used to determine specific string extractions.
#       Will not be passed to the generation script if it is undefined.
#
#   deps (optional)
#   visibility (optional)

# Some locales exist in |locales| but don't generally have an xtb file on disk
# and some translations don't exist in |locales| but do generally have an xtb
# file on disk.
default_embedded_i18_locales = locales - ["en-US", "he", "nb"] + ["iw", "no"]

template("generate_embedded_i18n") {
  assert(defined(invoker.grd_files_info),
         "Grd file information must be defined for $target_name")
  assert(defined(invoker.output_file_name_base),
         "Output file name base must be defined for $target_name")

  if (defined(invoker.extractor_datafile)) {
    extractor_datafile = invoker.extractor_datafile
  }

  grd_files_info = invoker.grd_files_info
  output_file_name_base = invoker.output_file_name_base

  if (defined(invoker.branding)) {
    branding = invoker.branding
  }

  first_resource_id = "1600"
  if (defined(invoker.first_resource_id)) {
    first_resource_id = invoker.first_resource_id
  }

  action(target_name) {
    script = "//base/win/embedded_i18n/create_string_rc.py"
    inputs = []

    output_dir = rebase_path(target_gen_dir, root_build_dir)

    output_header = "$target_gen_dir/$output_file_name_base.h"
    output_rc = "$target_gen_dir/$output_file_name_base.rc"

    outputs = [
      output_header,
      output_rc,
    ]

    args = [
      "--header-file",
      "$output_dir/$output_file_name_base.h",
      "--rc-file",
      "$output_dir/$output_file_name_base.rc",
      "--first-resource-id",
      first_resource_id,
    ]

    foreach(grd_file_info, grd_files_info) {
      grdfile_folder = grd_file_info[0]
      grdfile_name = grd_file_info[1]
      xtb_relative_path = grd_file_info[2]
      grd_file = "$grdfile_folder/$grdfile_name.grd"
      resource_path = "$grdfile_folder/$xtb_relative_path"
      inputs += [ grd_file ]

      args += [
        "-i",
        rebase_path(grd_file, root_build_dir),
        "-r",
        xtb_relative_path,
      ]

      xtb_locales = grd_file_info[3]

      foreach (locale, xtb_locales) {
        expected_xtb_input = "${resource_path}/${grdfile_name}_${locale}.xtb"
        args += [
          "-x",
          rebase_path(expected_xtb_input, root_build_dir),
        ]
        inputs += [ expected_xtb_input ]
      }
    }

    if (defined(extractor_datafile)) {
      inputs += [ extractor_datafile ]

      args += [
        "--extract-datafile",
        rebase_path(extractor_datafile, root_build_dir),
      ]
    }

    if (defined(branding)) {
      args += [
        "-b",
        branding,
      ]
    }

    forward_variables_from(invoker, [ "deps" ])
    forward_variables_from(invoker, [ "visibility" ])
  }
}
