// Copyright 2021 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.

#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_METRICS_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_METRICS_H_

#include <lib/sys/inspect/cpp/component.h>

#include <fbl/macros.h>

namespace bt {

// Represents a metric counter.
template <typename property_t>
class MetricCounter {
 public:
  MetricCounter() = default;

  // Attach peer inspect node as a child node of |parent|.
  virtual void AttachInspect(inspect::Node& parent, const std::string& name);

  // Increment the metrics counter by |value|.
  void Add(int value = 1) { inspect_property_.Add(value); }

  // Decrement the metrics counter by |value|.
  void Subtract(int value = 1) { inspect_property_.Subtract(value); }

 private:
  // Node property
  property_t inspect_property_;

  // Update underlying inspect attributes.
  void UpdateInspect();

  DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(MetricCounter);
};

using IntMetricCounter = MetricCounter<inspect::IntProperty>;
using UintMetricCounter = MetricCounter<inspect::UintProperty>;

}  // namespace bt

#endif  // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_METRICS_H_
