# 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
#
#   target_asset_dir
#     Optional: Absolute path to the directory that holds the resulting assets.
#     Type: file
#     Default: "/config/data/assets"
#
#
# 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, root_build_dir),
      ]

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

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

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

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

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

      if (defined(invoker.target_asset_dir)) {
        args += [
          "--target-asset-dir",
          invoker.target_asset_dir,
        ]
      }
    } else {
      args += [ "--empty" ]
    }

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

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