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

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,
  ]
  deps = [ dir_pw_polyfill ]
}

################################################################################
# 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" ]
}
