# Copyright 2018 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.

# Runs the Cobalt registry parser on either the entire (global) registry or
# the registry for a single project. This has the following effects:
# - Validates the registry entries
# - Populates the privacy encoding fields of each ReportDefinition
# - Optionally generates source code files in various programming languages
#   containing definitions of constants that facilitate interacting with
#   the Cobalt API.
# - Optionally generates a binary protocol buffer representation of the
#   registry
#
# Args:
#   global: (default: false) Should generate the global registry. If true then
#           do not specify |customer_id| or |project_id|.
#   customer_id: (default: 1) numeric customer_id of the project to generate.
#                optional.
#   project_id: numeric project_id of the project to generate the registry of
#   output_name: base of the filename for the output. optional.
#   generate_binarypb: (default: false) should we generate a *.pb file with a
#                      binary representation of the registry.
#   generate_cc: (default: false) Should we generate a *.cb.h file and a library.
#   generate_dart: (default: false) Should we generate a dart library.
#   generate_rust: (default: false) Should we generate a rust crate.
#   directories: (default: [//third_party/cobalt_config]) The directories to parse.
#   exclude_projects: (default: []) A list of the projects to exclude from the
#                     parsed directories. Projects are identified by a colon
#                     separated "customer_id:project_id".
#   privacy_encoding_params_file: (default:
#                 "$cobalt_root/src/algorithms/privacy/data/privacy_encoding_params")
#                 A file containing precomputed privacy encoding parameters.
#   allow_empty_output: (default: false) Should we allow the output file to be empty.
#   features: (default: []) The list of features to enable.
#   dimension_name_maps_for_metric_ids: (default: []) The list of metric ids for
#                                       which to generate name maps.
#
# Note: Other args are forwarded to dart_library when generate_dart is true.
#
# example usage:
#
# metrics_registry("generate_testapp_registry") {
#   project_id = 2
# }

import("//build/compiled_action.gni")

template("metrics_registry") {
  forward_variables_from(invoker, [ "visibility" ])

  if (defined(invoker.global)) {
    global = invoker.global
  } else {
    global = false
  }

  if (defined(invoker.customer_id)) {
    not_needed([ "global" ])
    customer_id = invoker.customer_id
  } else if (!global) {
    # Customer is Fuchsia
    customer_id = 1
  }

  if (defined(invoker.project_id)) {
    not_needed([ "global" ])
    project_id = invoker.project_id
  } else {
    assert(global, "Exactly one of 'project_id' or 'global' must be defined")
  }

  if (defined(invoker.namespace)) {
    namespace = invoker.namespace
  } else {
    namespace = ""
  }

  if (defined(invoker.generate_binarypb)) {
    generate_binarypb = invoker.generate_binarypb
  } else {
    # If generate_binarypb has not been specified it defaults to false for
    # non-global and true for global.
    generate_binarypb = global
  }

  if (defined(invoker.generate_cc)) {
    generate_cc = invoker.generate_cc
  } else {
    generate_cc = false
  }

  if (defined(invoker.generate_dart)) {
    generate_dart = invoker.generate_dart
  } else {
    generate_dart = false
  }

  if (defined(invoker.generate_go)) {
    generate_go = invoker.generate_go
  } else {
    generate_go = false
  }

  if (defined(invoker.go_package_name)) {
    go_package_name = invoker.go_package_name
  }

  if (defined(invoker.generate_rust)) {
    generate_rust = invoker.generate_rust
  } else {
    generate_rust = false
  }

  if (defined(invoker.source)) {
    source = invoker.source
  }

  if (defined(invoker.skip_validation)) {
    skip_validation = invoker.skip_validation
  } else {
    skip_validation = false
  }

  if (defined(invoker.features)) {
    features = invoker.features
  }

  if (defined(invoker.var_name)) {
    var_name = invoker.var_name
  }

  if (defined(invoker.use_target_name)) {
    not_needed(invoker, [ "use_target_name" ])
  }

  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  } else {
    output_name = target_name
  }

  if (defined(invoker.directories)) {
    cobalt_config_dirs = invoker.directories
  } else {
    cobalt_config_dirs = [ "//third_party/cobalt_config" ]
  }

  if (defined(invoker.exclude_projects)) {
    exclude_projects = invoker.exclude_projects
  } else {
    exclude_projects = []
  }

  if (defined(invoker.privacy_encoding_params_file)) {
    privacy_encoding_params_file = invoker.privacy_encoding_params_file
  } else {
    privacy_encoding_params_file =
        "$cobalt_root/src/algorithms/privacy/data/privacy_encoding_params"
  }

  if (defined(invoker.allow_empty_output)) {
    allow_empty_output = invoker.allow_empty_output
  } else {
    allow_empty_output = false
  }

  if (defined(invoker.dimension_name_maps_for_metric_ids)) {
    dimension_name_maps_for_metric_ids =
        invoker.dimension_name_maps_for_metric_ids
  }

  out_format = ""
  generated_files = []
  if (generate_binarypb) {
    out_format = "${out_format}bin "
    generated_files += [ "$target_gen_dir/$output_name.pb" ]
  }
  if (generate_cc) {
    out_format = "${out_format}cpp "
    cc_source_file = "$target_gen_dir/$output_name.cb.h"
    generated_files += [ cc_source_file ]
  }
  if (generate_dart) {
    out_format = "${out_format}dart "
    dart_out_dir = "$target_gen_dir/${target_name}_package"
    dart_src_dir = "$dart_out_dir/lib"
    dart_library_name = target_name
    dart_source_file = "$dart_src_dir/$output_name.dart"
    generated_files += [ dart_source_file ]
  }
  if (generate_rust) {
    out_format = "${out_format}rust "
    rust_source_file = "$target_gen_dir/$output_name.rs"
    generated_files += [ rust_source_file ]
  }
  if (generate_go) {
    out_format = "${out_format}go "
    go_source_file = "$target_gen_dir/$output_name.go"
    generated_files += [ go_source_file ]
  }

  gen_target_name = "${target_name}_gen"
  group_deps = [ ":${gen_target_name}" ]

  compiled_action(gen_target_name) {
    tool = "$cobalt_root/src/bin/config_parser/src:bin"
    tool_output_name = "config_parser"

    depfile = "$target_gen_dir/$output_name.d"
    outputs = generated_files
    inputs = []
    foreach(config_dir, cobalt_config_dirs) {
      inputs += [ "$config_dir/projects.yaml" ]
    }

    args = [
      "-out_format",
      "$out_format",
      "-out_filename",
      "$output_name",
      "-out_dir",
      rebase_path(target_gen_dir, root_build_dir),
      "-for_client",
      "-dep_file",
      rebase_path(depfile, root_build_dir),
    ]

    if (skip_validation) {
      args += [ "-skip_validation" ]
    }

    if (defined(features)) {
      args += [
        "-features",
        string_join(",", features),
      ]
    }

    if (defined(dimension_name_maps_for_metric_ids)) {
      args += [
        "-dimension_name_maps_for_metric_ids",
        string_join(",", dimension_name_maps_for_metric_ids),
      ]
    }

    if (defined(var_name)) {
      args += [
        "-var_name",
        var_name,
      ]
    }

    if (defined(source)) {
      args += [
        "-config_file",
        rebase_path(source, root_build_dir),
      ]
    } else {
      foreach(config_dir, cobalt_config_dirs) {
        args += [
          "-config_dir",
          rebase_path(config_dir, root_build_dir),
        ]
      }
    }

    if (defined(exclude_projects)) {
      foreach(exclude_project, exclude_projects) {
        args += [
          "-exclude_project",
          "$exclude_project",
        ]
      }
    }

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

    if (allow_empty_output) {
      args += [ "-allow_empty_output" ]
    }

    if (defined(customer_id)) {
      args += [
        "-customer_id",
        "$customer_id",
      ]
    }

    if (namespace != "") {
      args += [
        "-namespace",
        "${namespace}",
      ]
    }

    if (defined(project_id)) {
      args += [
        "-project_id",
        "$project_id",
      ]
    }

    if (generate_dart) {
      args += [
        "-dart_out_dir",
        rebase_path(dart_src_dir, root_build_dir),
      ]
    }

    if (generate_go) {
      args += [
        "-go_package",
        go_package_name,
      ]
    }

    # The generated source code will have a stale timestamp if
    # its contents do not change.  This is ok, as it terminates
    # the build early when downstream actions need not be re-run.
    # The out-of-Fuchsia build is not trace-enabled.
    if (is_fuchsia_tree) {
      all_outputs_fresh = false
    }
  }

  if (generate_cc) {
    cclib = "${target_name}_cc"
    group_deps += [ ":${cclib}" ]

    source_set(cclib) {
      output_name = cclib

      sources = [ cc_source_file ]

      public_deps = [ ":$gen_target_name" ]
    }
  }

  if (generate_dart) {
    import("//build/dart/dart_library.gni")

    dartlib = "${target_name}_dartlib"
    group_deps += [ ":${dartlib}" ]

    copy_pubspec_target_name = "${dartlib}_copy_pubspec"
    copy_options_target_name = "${dartlib}_copy_options"

    copy(copy_pubspec_target_name) {
      sources = [ "//build/dart/empty_pubspec.yaml" ]

      outputs = [ "$dart_out_dir/pubspec.yaml" ]
    }

    copy(copy_options_target_name) {
      sources = [ "//build/dart/analysis_options.yaml" ]

      outputs = [ "$dart_out_dir/analysis_options.yaml" ]
    }

    dart_library(dartlib) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "sdk_category",
                               "visibility",
                             ])

      package_root = dart_out_dir

      package_name = dart_library_name

      sources = [ rebase_path(dart_source_file, dart_src_dir) ]

      if (defined(invoker.deps)) {
        deps += invoker.deps
      }

      if (defined(invoker.public_deps)) {
        deps += invoker.public_deps
      }

      non_dart_deps = [
        ":$copy_options_target_name",
        ":$copy_pubspec_target_name",
        ":$gen_target_name",
      ]
    }
  }

  if (generate_rust) {
    import("//build/rust/rustc_library.gni")

    rust_library_name = target_name
    rustlib = "${target_name}_rustlib"
    group_deps += [ ":${rustlib}" ]
    rustc_library(rustlib) {
      name = rust_library_name

      version = "1.0.0"
      edition = "2018"
      source_root = rust_source_file

      if (is_fuchsia_tree) {
        sources = [ rust_source_file ]
      }

      deps = [ "$cobalt_root/src/lib/client/rust:cobalt-client" ]

      non_rust_deps = [ ":$gen_target_name" ]
    }
  }

  if (generate_go) {
    import("//build/go/go_library.gni")

    source_dir = target_gen_dir
    go_library("${target_name}_golib") {
      name = target_name
      non_go_deps = [ ":$gen_target_name" ]
      sources = [ rebase_path(go_source_file, target_gen_dir) ]
    }
  }

  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = group_deps
  }
}
