# 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")
import("//src/fonts/build/font_args.gni")
import("//src/fonts/build/font_manifest.gni")

################################################################################
# Merge the contents of all the .font_pkgs.json files
################################################################################

font_pkg_entries = []
all_font_file_paths = []

# Default prefix for the manifest file name in /config/data.
_default_manifest_prefix = "all"

# Default name of the Fuchsia package containing the font service component.
_default_font_service_pkg = "fonts"

foreach(font_pkgs_path, font_pkgs_paths) {
  parsed = {
  }
  parsed = read_file(font_pkgs_path, "json")
  foreach(entry, parsed.packages) {
    # GN doesn't support real set operations and removing an item that's not
    # already in the list is an error, so to deduplicate, we add one instance,
    # remove all instances, and then add again.
    font_pkg_entries += [ entry ]
    font_pkg_entries -= [ entry ]
    font_pkg_entries += [ entry ]

    path_prefix = entry.path_prefix
    if (path_prefix != "") {
      path_prefix = "${path_prefix}/"
    }
    all_font_file_paths += [ "${fonts_dir}/${path_prefix}${entry.file_name}" ]
  }
}

# Define a `config_data` target to bundle all of the given font files into the
# font server's "/config/data".
#
# Parameters
#
#   asset_names
#     Required: List of font file names, e.g. [ "Roboto-Regular.ttf" ]
#     Type: list(file)
#
#   font_service_pkg
#     Optional: Name of the Fuchsia package containing the font service
#     component, used in `config_data` rules to provide data files to that
#     package.
#     Default: "fonts"
#     Type: string
template("local_font_bundle") {
  forward_variables_from(invoker,
                         [
                           "asset_names",
                           "font_service_pkg",
                         ])
  assert(defined(asset_names))

  if (!defined(font_service_pkg)) {
    font_service_pkg = _default_font_service_pkg
  }

  local_asset_paths = []
  not_found_asset_names = []

  foreach(asset_name, asset_names) {
    found = false
    foreach(entry, font_pkg_entries) {
      if (asset_name == entry.file_name) {
        found = true
        asset_path = entry.path_prefix
        if (asset_path != "") {
          asset_path = "${asset_path}/"
        }
        asset_path = "${fonts_dir}/${asset_path}${entry.file_name}"
        local_asset_paths += [ asset_path ]
      }
    }
    if (!found) {
      not_found_asset_names += [ asset_name ]
    }
  }

  assert(not_found_asset_names == [],
         "font_pkg_entries not found for ${not_found_asset_names}")

  config_data_label = "_${target_name}_config_data"
  config_data(config_data_label) {
    forward_variables_from(invoker, [ "testonly" ])
    for_pkg = font_service_pkg
    sources = local_asset_paths
    outputs = [ "assets/{{source_file_part}}" ]
  }

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    deps = [ ":${config_data_label}" ]
    metadata = {
      local_font_file_names = asset_names
      font_barrier = []
    }
  }
}

# Generate all of the `config_data` targets needed for a target product's font
# collection.
#
# This can be a combination of font `package`s and local font bundles.
#
# Parameters
#
#   font_packages
#     Optional: GN labels of font `package`s and/or `font_package_group`s that
#     are in `universe_package_labels` for the target product.
#     Type: list(label)
#
#   local_font_bundles
#     Optional: GN labels of `local_font_bundle`s (or `group`s thereof) for the
#     target product. These will be included in the font server's
#     "/config/data".
#     Type: list(label)
#
#   local_asset_names
#     Optional: List of local font file names. These will be included in the
#     font server's "/config/data". If `local_font_bundles` is defined,
#     `local_asset_names` will simply be added on as another bundle.
#     Type: list(file)
#
#   product_config_path:
#     Optional: Path to a JSON file containing product-specific font
#     configuration, including a fallback chain.
#     Type: file
#
#   manifest_prefix
#     Optional: Prefix for the generated manifest file name.
#     Default: "all"
#     Type: string
#
#   empty
#     Optional: If set to true, indicates that this collection is intentionally
#     empty.
#     Type: boolean
#
#   testonly
#     Optional: If set to true, config_data will *not* be generated for
#     pkg_resolver, which doesn't support loading arbitrary font package
#     registry files.
#     Type: boolean
#
#   font_service_pkg
#     Optional: Name of the Fuchsia package containing the font service
#     component, used in `config_data` rules to provide data files to that
#     package.
#     Default: "fonts"
#     Type: string
template("font_collection") {
  forward_variables_from(invoker,
                         [
                           "font_packages",
                           "local_font_bundles",
                           "local_asset_names",
                           "product_config_path",
                           "manifest_prefix",
                           "font_service_pkg",
                         ])

  if (!defined(font_packages)) {
    font_packages = []
  }

  if (!defined(local_font_bundles)) {
    local_font_bundles = []
  }

  if (!defined(manifest_prefix)) {
    manifest_prefix = _default_manifest_prefix
  }

  if (!defined(font_service_pkg)) {
    font_service_pkg = _default_font_service_pkg
  }

  if (!defined(invoker.empty)) {
    invoker.empty = false
  }

  if (!defined(invoker.testonly)) {
    invoker.testonly = false
  }

  assert(
      !(invoker.testonly && manifest_prefix == _default_manifest_prefix &&
            font_service_pkg == _default_font_service_pkg),
      "Can't use default manifest_prefix '${manifest_prefix}' with a testonly font_collection.")

  # The font resolver in pkg_resolver expects a hard-coded location in
  # /config/data for the file font_packages.json. To avoid collisions from
  # multiple definitions of that file, we don't add it to config_data when
  # building tests.
  generate_pkg_resolver_config_data = !invoker.testonly

  if (defined(local_asset_names)) {
    bundle_name = "_${target_name}_local_font_bundle"
    local_font_bundle(bundle_name) {
      asset_names = local_asset_names
    }
    local_font_bundles += [ ":${bundle_name}" ]
  }

  # `fx format-code` insists on removing clarifying parentheses here.
  assert(font_packages + local_font_bundles == [] == invoker.empty,
         "An empty font_collection must explicitly declare `empty = true`")

  ##############################################################################
  # Generate font_packages.json, used by pkg-resolver to know which Fuchsia
  # packages are font packages.
  ##############################################################################
  pkg_resolver_registry_path =
      "${target_gen_dir}/${target_name}_font_packages.json"
  pkg_resolver_registry_label = "${target_name}_font_packages.json"
  pkg_resolver_config_data_label =
      "${target_name}_pkg_resolver_font_packages_config_data"

  _group_visibility = ":${target_name}"
  generated_file(pkg_resolver_registry_label) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = font_packages
    if (generate_pkg_resolver_config_data) {
      visibility = [ ":${pkg_resolver_config_data_label}" ]
      not_needed([ "_group_visibility" ])
    } else {
      visibility = [ _group_visibility ]
      not_needed([ "pkg_resolver_config_data_label" ])
    }
    data_keys = [ "fuchsia_package_urls" ]
    walk_keys = [ "font_barrier" ]
    output_conversion = "json"
    outputs = [ pkg_resolver_registry_path ]
  }

  if (generate_pkg_resolver_config_data) {
    config_data(pkg_resolver_config_data_label) {
      for_pkg = "pkg-resolver"

      # This output name is fixed.
      # There can be only one instance of this target included in any product.
      outputs = [ "font_packages.json" ]
      sources = [ pkg_resolver_registry_path ]
    }
  }

  ##############################################################################
  # Generate all_fonts.json, used by the manifest generator to know the
  # list of font files available in the product.
  ##############################################################################
  _all_fonts_json_path = "${target_gen_dir}/${target_name}_all_fonts.json"
  _all_fonts_json_label = "${target_name}_all_fonts.json"
  generated_file(_all_fonts_json_label) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = font_packages
    data_keys = [ "font_file_names" ]
    walk_keys = [ "font_barrier" ]
    output_conversion = "json"
    outputs = [ _all_fonts_json_path ]
  }

  ##############################################################################
  # Generate local_fonts.json, used by the manifest generator to know which font
  # files are available in the font server's /config/data directory.
  ##############################################################################
  _local_fonts_json_path = "${target_gen_dir}/${target_name}_local_fonts.json"
  _local_fonts_json_label = "${target_name}_local_fonts.json"
  generated_file(_local_fonts_json_label) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = local_font_bundles
    data_keys = [ "local_font_file_names" ]
    walk_keys = [ "font_barrier" ]
    output_conversion = "json"
    outputs = [ _local_fonts_json_path ]
  }

  ##############################################################################
  # Generate the .font_manifest.json file and config_data target
  ##############################################################################
  manifest_file_label = "${target_name}_manifest_file"
  manifest_file_path = "${target_out_dir}/${target_name}_all.font_manifest.json"
  font_manifest(manifest_file_label) {
    forward_variables_from(invoker, [ "testonly" ])
    all_fonts_path = _all_fonts_json_path
    local_fonts_path = _local_fonts_json_path
    font_files = all_font_file_paths
    deps = [
      ":${_all_fonts_json_label}",
      ":${_local_fonts_json_label}",
    ]
    output = manifest_file_path
    pretty_print = is_debug
  }

  # Will appear at "/config/data/${manifest_prefix}.font_manifest.json"
  font_manifest_config_data_label = "${target_name}_font_manifest_config_data"
  config_data(font_manifest_config_data_label) {
    forward_variables_from(invoker, [ "testonly" ])
    for_pkg = font_service_pkg
    deps = [ ":${manifest_file_label}" ]
    sources = get_target_outputs(":${manifest_file_label}")
    outputs = [ "${manifest_prefix}.font_manifest.json" ]
  }

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

    deps = local_font_bundles + [ ":${font_manifest_config_data_label}" ]
    if (generate_pkg_resolver_config_data) {
      deps += [ ":${pkg_resolver_config_data_label}" ]
    } else {
      deps += [ ":${pkg_resolver_registry_label}" ]
    }
  }
}

# Define a `group` consisting of the font `package`s for each of the given
# `asset_names`.
#
# Parameters
#
#   asset_names
#     Required: List of font file names, e.g. ["Roboto-Regular.ttf"], to be
#     included in this group.
#     Type: list(file)
#
template("font_package_group") {
  forward_variables_from(invoker, [ "asset_names" ])
  assert(defined(asset_names))

  font_package_labels = []
  not_found_asset_names = []

  foreach(asset_name, asset_names) {
    found = false
    foreach(entry, font_pkg_entries) {
      if (asset_name == entry.file_name) {
        found = true
        font_package_labels +=
            [ "//src/fonts/packages:font-package-${entry.safe_name}" ]
      }
    }
    if (!found) {
      not_found_asset_names += [ asset_name ]
    }
  }
  assert(not_found_asset_names == [],
         "font_pkg_entries not found for ${not_found_asset_names}")

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])
    deps = font_package_labels
  }
}
