# Copyright 2019 The Fuchsia 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.gni")

# Provide ICU time zone resource files to the given package.
#
# The following files will be available in the component's namespace:
#
# * /config/data/tzdata/revision.txt
# * /config/data/tzdata/icu/44/le/metaZones.res
# * /config/data/tzdata/icu/44/le/timezoneTypes.res
# * /config/data/tzdata/icu/44/le/zoneinfo64.res
#
# For `testonly = true` targets, the rule will add a marker file:
#
# * /config/data/FUCHSIA_IN_TREE_TEST
#
# Please see `README.md` for detailed documentation.
template("icu_tzdata_config_data") {
  _resources_label = "_${target_name}_resources"
  config_data(_resources_label) {
    forward_variables_from(invoker,
                           [
                             "for_pkg",
                             "testonly",
                           ])

    data_version = "44"
    if (defined(invoker.data_version)) {
      data_version = invoker.data_version
    }

    format = "le"
    if (defined(invoker.format)) {
      format = invoker.format
    }

    assert(data_version == "44" && format == "le",
           "Unsupported data version or format")

    deps = [ "//src/lib/icu/tzdata:revision" ]

    outputs = [ "tzdata/icu/${data_version}/${format}/{{source_file_part}}" ]

    sources = [
      "//third_party/icu/tzres/metaZones.res",
      "//third_party/icu/tzres/timezoneTypes.res",
      "//third_party/icu/tzres/zoneinfo64.res",
    ]

    # //src/lib/icu/tzdata:revision will be found in the build directory at
    #`out/default/gen/src/lib/icu/tzdata/revision.txt`
  }

  _revision_label = "_${target_name}_revision"
  config_data(_revision_label) {
    forward_variables_from(invoker,
                           [
                             "for_pkg",
                             "testonly",
                           ])
    deps = [ "//src/lib/icu/tzdata:revision" ]

    outputs = [ "tzdata/{{source_file_part}}" ]

    # get_target_outputs("//src/lib/icu/tzdata:revision") can only be used in
    # //src/lib/icu/tzdata/BUILD.gn, so we have to hard-code the file path.
    sources = [
      # This is usually `out/default/gen/src/lib/icu/tzdata/revision.txt`
      "${root_gen_dir}/src/lib/icu/tzdata/revision.txt",
    ]
  }

  if (defined(invoker.testonly) && invoker.testonly) {
    _test_marker_label = "_${target_name}_test_marker"

    # Includes a dummy file only for test targets.
    config_data(_test_marker_label) {
      forward_variables_from(invoker,
                             [
                               "for_pkg",
                               "testonly",
                             ])
      sources = [ "//src/lib/icu/tzdata/testing/FUCHSIA_IN_TREE_TEST" ]
    }
  }

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    deps = [
      ":${_resources_label}",
      ":${_revision_label}",
    ]

    if (defined(testonly) && testonly) {
      deps += [ ":${_test_marker_label}" ]
    }
  }
}
