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

# Generate a .font_manifest.json file from the inputs.
#
# Parameters
#
#   product_config_path:
#     Optional: Path to a JSON file containing product-specific font
#     configuration, including a fallback chain.
#     Type: file
#
#   all_fonts_path
#     Required: Path to a JSON file containing an array of all the font file
#     names in the target product.
#     Type: file
#
#   local_fonts_path
#     Required: Path to a JSON file containing an array of the local font file
#     names in the target product. This should be a subset of the array in
#     `all_fonts_path`.
#     Type: file
#
#   font_files
#      Required: Paths to all of the font files that will be included in this
#      manifest, or a superset thereof. This is different from the contents of
#      `all_fonts_path` because it must be known at GN generation time.
#      Type: list(file)
#
#   pretty_print
#     Optional: If present and true, the .font_manifest.json file will be
#     pretty-printed for easier human reading. This increases uncompressed file
#     size, and therefore slightly increases the time required to parse a
#     manifest at runtime. Due to compression, there is virtually no effect on
#     storage size.
#     Type: boolean
#     Default: false
#
#   output
#     Required: Path to the .font_manifest.json file that we'll be writing.
#     Type: file
#
#
# Build variables
#
#   fonts_dir
#     Required: Path to the top-level directory into which all the font files
#     were checked out of CIPD
#     Type: directory
#
#   font_pkgs_paths
#     Required: Paths to .font_pkgs.json files, containing the values needed to
#     determine a GN package name for each font file.
#     Type: list(file)
#
#   font_catalog_paths
#     Required: Paths to .font_catalog.json files, containing  human-provided
#     metadata about all the font families and typefaces.
#     Type: list(file)
template("font_manifest") {
  forward_variables_from(invoker,
                         [
                           "product_config_path",
                           "all_fonts_path",
                           "local_fonts_path",
                           "font_files",
                           "pretty_print",
                           "output",
                         ])

  assert(defined(all_fonts_path))
  assert(defined(local_fonts_path))
  assert(defined(font_pkgs_paths))
  assert(defined(font_catalog_paths))
  assert(defined(font_files))
  assert(defined(output))

  if (!defined(pretty_print)) {
    pretty_print = false
  }

  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])
    tool = "//src/fonts/tools/manifest_generator:font_manifest_generator"
    sources = [
                all_fonts_path,
                local_fonts_path,
              ] + font_pkgs_paths + font_catalog_paths + font_files
    if (defined(product_config_path)) {
      sources += [ product_config_path ]
    }
    outputs = [ output ]
    deps = invoker.deps

    args = []

    # Most of the unit test builds are based on the "core" product and therefore
    # don't include fonts. That case is handled further down.
    if (font_pkgs_paths != [] && font_catalog_paths != [] && font_files != []) {
      args += [
        "--all-fonts",
        rebase_path(all_fonts_path),
      ]

      args += [
        "--local-fonts",
        rebase_path(local_fonts_path),
      ]

      args += [
        "--font-dir",
        rebase_path(fonts_dir),
      ]

      args += [ "--font-pkgs" ]
      foreach(font_pkgs_path, font_pkgs_paths) {
        args += [ rebase_path(font_pkgs_path) ]
      }

      args += [ "--font-catalog" ]
      foreach(font_catalog_path, font_catalog_paths) {
        args += [ rebase_path(font_catalog_path) ]
      }

      if (defined(product_config_path)) {
        args += [
          "--product-config",
          rebase_path(product_config_path),
        ]
      }
    } else {
      args += [ "--empty" ]
    }

    if (pretty_print) {
      args += [ "--pretty-print" ]
    }

    args += [
      "--output",
      rebase_path(output),
    ]
  }
}
