// Copyright 2020 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 EXAMPLES_DIAGNOSTICS_INSPECT_CODELAB_CPP_PART_3_REVERSER_H_
#define EXAMPLES_DIAGNOSTICS_INSPECT_CODELAB_CPP_PART_3_REVERSER_H_

#include <fuchsia/examples/inspect/cpp/fidl.h>
#include <lib/inspect/cpp/inspect.h>

// Reverser stats encapsulates all stat input to the Reverser.
struct ReverserStats {
  // The node for an individual connection to the Reverser service.
  inspect::Node connection_node;

  // Global property for request count.
  // Updating properties is thread-safe.
  std::shared_ptr<inspect::UintProperty> global_request_count;

  // Creates a default ReverserStats on which all operations are no-ops.
  static ReverserStats CreateDefault() {
    return ReverserStats{.connection_node = inspect::Node(),
                         .global_request_count = std::make_shared<inspect::UintProperty>()};
  }
};

// Implementation of the fuchsia.examples.inspect.Reverser protocol.
//
// Each instantiation of this class handles a single connection to Reverser.
class Reverser final : public fuchsia::examples::inspect::Reverser {
 public:
  // Construct a new reverser that exposes stats.
  Reverser(ReverserStats stats);

  // Implementation of Reverser.Reverse().
  void Reverse(std::string input, ReverseCallback callback) override;

  // Return a request handler for the Reverser protocol that binds incoming requests to new
  // Reversers.
  //
  // |node| is an inspect Node to store stat information under.
  static fidl::InterfaceRequestHandler<fuchsia::examples::inspect::Reverser> CreateDefaultHandler(
      inspect::Node node);

 private:
  // The incoming stats nodes for this property.
  ReverserStats stats_;

  // Local request and response counts.
  inspect::UintProperty request_count_, response_count_;
};

#endif  // EXAMPLES_DIAGNOSTICS_INSPECT_CODELAB_CPP_PART_3_REVERSER_H_
