# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_bloat/bloat.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_third_party/nanopb/nanopb.gni")
import("$dir_pw_unit_test/test.gni")
config("default_config") {
  include_dirs = [ "public" ]
}

pw_source_set("pw_metric") {
  public_configs = [ ":default_config" ]
  public = [ "public/pw_metric/metric.h" ]
  sources = [ "metric.cc" ]
  public_deps = [
    "$dir_pw_tokenizer:base64",
    dir_pw_assert,
    dir_pw_containers,
    dir_pw_log,
    dir_pw_tokenizer,
  ]
}

# This gives access to the "PW_METRIC_GLOBAL()" macros, for globally-registered
# metric definitions.
pw_source_set("global") {
  public_configs = [ ":default_config" ]
  public = [ "public/pw_metric/global.h" ]
  sources = [ "global.cc" ]
  public_deps = [
    ":pw_metric",
    dir_pw_tokenizer,
  ]
}

################################################################################
# Service
pw_proto_library("metric_service_proto") {
  sources = [ "pw_metric_proto/metric_service.proto" ]
  inputs = [ "pw_metric_proto/metric_service.options" ]
}

# TODO(keir): Consider moving the nanopb service into the nanopb/ directory
# instead of having it directly inside pw_metric/.
if (dir_pw_third_party_nanopb != "") {
  pw_source_set("metric_service_nanopb") {
    public_configs = [ ":default_config" ]
    public_deps = [
      ":metric_service_proto_nanopb_rpc",
      ":pw_metric",
    ]
    public = [ "public/pw_metric/metric_service_nanopb.h" ]
    deps = [
      ":metric_service_proto_nanopb_rpc",
      "$dir_pw_containers:vector",
      dir_pw_tokenizer,
    ]
    sources = [ "metric_service_nanopb.cc" ]
  }

  pw_test("metric_service_nanopb_test") {
    deps = [
      ":global",
      ":metric_service_nanopb",
      "$dir_pw_rpc/nanopb:test_method_context",
    ]
    sources = [ "metric_service_nanopb_test.cc" ]
  }
}

################################################################################

pw_test_group("tests") {
  tests = [
    ":metric_test",
    ":global_test",
  ]
  if (dir_pw_third_party_nanopb != "") {
    tests += [ ":metric_service_nanopb_test" ]
  }
}

pw_test("metric_test") {
  sources = [ "metric_test.cc" ]
  deps = [ ":pw_metric" ]
}

pw_test("global_test") {
  sources = [ "global_test.cc" ]
  deps = [ ":global" ]
}

pw_size_report("metric_size_report") {
  title = "Typical pw_metric use (no RPC service)"

  # To see all the symbols, uncomment the following:
  # Note: The size report RST table won't be generated when full_report = true.
  #full_report = true

  binaries = [
    {
      target = "size_report:one_metric"
      base = "size_report:base"
      label = "1 metric and 1 group no dump or export"
    },
    {
      target = "size_report:dump"
      base = "size_report:base"
      label = "(+) dump group and metrics to log"
    },
    {
      target = "size_report:more_metrics"
      base = "size_report:dump"
      label = "(+) 1 group (+) 4 metrics"
    },
  ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  report_deps = [ ":metric_size_report" ]
}
