// Copyright 2019 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_DEVELOPER_MEMORY_MONITOR_MONITOR_H_
#define SRC_DEVELOPER_MEMORY_MONITOR_MONITOR_H_

#include <fidl/fuchsia.hardware.ram.metrics/cpp/fidl.h>
#include <fidl/fuchsia.memory.inspection/cpp/fidl.h>
#include <fidl/fuchsia.memorypressure/cpp/fidl.h>
#include <lib/async/dispatcher.h>
#include <lib/inspect/component/cpp/component.h>
#include <lib/trace/observer.h>
#include <lib/zx/socket.h>
#include <zircon/types.h>

#include "src/developer/memory/metrics/capture.h"
#include "src/developer/memory/metrics/digest.h"
#include "src/developer/memory/monitor/high_water.h"
#include "src/developer/memory/monitor/imminent_oom_observer.h"
#include "src/developer/memory/monitor/logger.h"
#include "src/developer/memory/monitor/memory_monitor_config.h"
#include "src/developer/memory/monitor/metrics.h"

namespace monitor {

namespace test {
class MemoryBandwidthInspectTest;
class MonitorPressureTest;
}  // namespace test

class Monitor : public fidl::Server<fuchsia_memory_inspection::Collector>,
                public fidl::Server<fuchsia_memorypressure::Watcher> {
 public:
  Monitor(
      async_dispatcher_t* dispatcher, memory_monitor_config::Config config,
      memory::CaptureMaker capture_maker,
      std::optional<fidl::Client<fuchsia_memorypressure::Provider>> pressure_provider =
          std::nullopt,
      ImminentOomObserver* imminent_oom_observer = nullptr,
      std::optional<fidl::Client<fuchsia_metrics::MetricEventLoggerFactory>>
          metric_event_logger_factory = std::nullopt,
      std::optional<fidl::Client<fuchsia_hardware_ram_metrics::Device>> ram_device = std::nullopt);
  ~Monitor() override = default;

  // Writes a memory capture and the bucket definition to |socket| in JSON,
  // in UTF-8.
  // See the fuchsia.memory.inspection FIDL library for a
  // description of the format of the JSON.
  void CollectJsonStats(CollectJsonStatsRequest& request,
                        CollectJsonStatsCompleter::Sync& completer) override;

  void CollectJsonStatsWithOptions(CollectJsonStatsWithOptionsRequest& request,
                                   CollectJsonStatsWithOptionsCompleter::Sync& completer) override;

  // fuchsia_memorypressure::Watcher implementation; this callback gets called
  // whenever a memory pressure change is signaled.
  void OnLevelChanged(OnLevelChangedRequest& request,
                      OnLevelChangedCompleter::Sync& completer) override;

  static const char kTraceName[];

 private:
  void CollectJsonStatsWithOptions(zx::socket socket);

  void CreateMetrics();

  void UpdateState();

  void SampleAndPost();
  void MeasureBandwidthAndPost();
  void PeriodicMeasureBandwidth();
  inspect::Inspector Inspect();

  void OnLevelChanged(pressure_signaler::Level level);

  memory::CaptureMaker capture_maker_;
  HighWater high_water_;
  bool tracing_;
  zx_handle_t root_;
  async_dispatcher_t* dispatcher_;
  trace::TraceObserver trace_observer_;
  memory_monitor_config::Config config_;
  inspect::ComponentInspector inspector_;
  Logger logger_;
  std::optional<fidl::Client<fuchsia_metrics::MetricEventLoggerFactory>>
      metric_event_logger_factory_;
  std::optional<Metrics> metrics_;
  std::vector<memory::BucketMatch> bucket_matches_;
  memory::Digester digester_;
  std::optional<fidl::Client<fuchsia_hardware_ram_metrics::Device>> ram_device_;
  uint64_t pending_bandwidth_measurements_ = 0;
  pressure_signaler::Level level_;

  // Imminent OOM monitoring
  ImminentOomObserver* imminent_oom_observer_;

  friend class test::MemoryBandwidthInspectTest;
  friend class test::MonitorPressureTest;
  FXL_DISALLOW_COPY_AND_ASSIGN(Monitor);
};

}  // namespace monitor

#endif  // SRC_DEVELOPER_MEMORY_MONITOR_MONITOR_H_
