// 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_2_REVERSER_H_
#define EXAMPLES_DIAGNOSTICS_INSPECT_CODELAB_CPP_PART_2_REVERSER_H_

#include <fuchsia/examples/inspect/cpp/fidl.h>
// [START part_1_include]
#include <lib/inspect/cpp/inspect.h>
// [END part_1_include]

// 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_2_REVERSER_H_
