# Copyright 2022 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/dist/resource.gni")
import("//src/lib/icu/tzdata/icu_tzres_source.gni")

# Provide ICU time zone resource files to the given package.
#
# The following files will be available in the component's namespace:
#
# * /pkg/tzdata/revision.txt
# * /pkg/tzdata/icu/revision.txt
# * /pkg/tzdata/icu/${data_version}/${format}/revision.txt
# * /pkg/tzdata/icu/${data_version}/${format}/metaZones.res
# * /pkg/tzdata/icu/${data_version}/${format}/timezoneTypes.res
# * /pkg/tzdata/icu/${data_version}/${format}/zoneinfo64.res
#
# We provide several instances of `revision.txt` as the tzdata_provider
# component offers several different flavors of ICU-related capabilities.
#
# For `testonly = true` targets, the rule will add a marker file:
#
# * /pkg/FUCHSIA_IN_TREE_TEST
#
# Please see `README.md` for detailed documentation.
#
# Parameters
#
#   data_version (optional)
#     Timezone data version.
#     Type: string
#     Default: 44
#
#   format (optional)
#     Timezone data format.
#     Type: string
#     Default: le
template("icu_tzdata_resource") {
  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")

  _resources_label = "_${target_name}_resources"
  resource(_resources_label) {
    forward_variables_from(invoker, [ "testonly" ])

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

    sources = [
      "${icu_tzres_path}/metaZones.res",
      "${icu_tzres_path}/timezoneTypes.res",
      "${icu_tzres_path}/zoneinfo64.res",
    ]
  }

  _revision_label = "_${target_name}_revision"
  resource(_revision_label) {
    forward_variables_from(invoker, [ "testonly" ])

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

    outputs = [ "data/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",
    ]
  }

  _revision_versioned_label = "_${target_name}_revision_versioned"
  resource(_revision_versioned_label) {
    forward_variables_from(invoker, [ "testonly" ])

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

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

    # See above.
    sources = [
      # This is usually `out/default/gen/src/lib/icu/tzdata/revision.txt`
      "${root_gen_dir}/src/lib/icu/tzdata/revision.txt",
    ]
  }

  _revision_tzdata_icu_versioned_label =
      "_${target_name}_tzdata_icu_revision_versioned"
  resource(_revision_tzdata_icu_versioned_label) {
    forward_variables_from(invoker, [ "testonly" ])

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

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

    # See above.
    sources = [ "${root_gen_dir}/src/lib/icu/tzdata/revision.txt" ]
  }

  # Includes a placeholder file only for test targets.
  _test_marker_label = "_${target_name}_test_marker"
  resource(_test_marker_label) {
    forward_variables_from(invoker, [ "testonly" ])
    sources = [ "//src/lib/icu/tzdata/testing/FUCHSIA_IN_TREE_TEST" ]
    outputs = [ "data/FUCHSIA_IN_TREE_TEST" ]
  }

  # tzdata-provider is not `testonly` so it can't depend on the main target.
  group("${target_name}_for_tzdata_provider") {
    forward_variables_from(invoker, [ "testonly" ])

    visibility = [ "//src/intl/tzdata_provider/*" ]

    deps = [
      ":${_resources_label}",

      # Used via the `config-data` capability.
      ":${_revision_label}",
      ":${_revision_versioned_label}",

      # Used via the `tzdata-icu` capability.
      ":${_revision_tzdata_icu_versioned_label}",

      # Used via the `tzdata-icu-44-le` capability.
      ":${_revision_versioned_label}",
    ]
  }

  group(target_name) {
    forward_variables_from(invoker, [ "visibility" ])

    # Production components should use ICU data from a directory
    # exposed by tzdata_provider for storage efficiency and for
    # configuration consistency.
    # Tests can include whatever data they need in the test package.
    testonly = true
    deps = [
      ":${_resources_label}",

      # Used via the `config-data` capability.
      ":${_revision_label}",

      # Used via the `tzdata-icu` capability.
      ":${_revision_tzdata_icu_versioned_label}",

      # Used via the `tzdata-icu-44-le` capability.
      ":${_revision_versioned_label}",
    ]

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