// Copyright 2022 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_FORENSICS_UTILS_UTC_CLOCK_READY_WATCHER_H_
#define SRC_DEVELOPER_FORENSICS_UTILS_UTC_CLOCK_READY_WATCHER_H_

#include <lib/async/cpp/wait.h>
#include <lib/async/dispatcher.h>
#include <lib/fit/function.h>
#include <lib/zx/clock.h>

namespace forensics {

class UtcClockReadyWatcherBase {
 public:
  virtual ~UtcClockReadyWatcherBase() = default;

  // Register a callback that will be executed when the utc clock becomes ready.
  virtual void OnClockReady(::fit::callback<void()> callback) = 0;
  virtual bool IsUtcClockReady() const = 0;
};

// Waits for signal from the system indicating the UTC clock is ready, then notifies interested
// parties.
class UtcClockReadyWatcher : public UtcClockReadyWatcherBase {
 public:
  UtcClockReadyWatcher(async_dispatcher_t* dispatcher, zx::unowned_clock clock_handle);
  ~UtcClockReadyWatcher() override = default;

  // Register a callback that will be executed when the utc clock becomes ready.
  void OnClockReady(::fit::callback<void()> callback) override;
  bool IsUtcClockReady() const override;

 private:
  void OnClockLoggingQuality(async_dispatcher_t* dispatcher, async::WaitBase* wait,
                             zx_status_t status, const zx_packet_signal_t* signal);

  std::vector<::fit::callback<void()>> callbacks_;
  bool is_utc_clock_ready_ = false;

  async::WaitMethod<UtcClockReadyWatcher, &UtcClockReadyWatcher::OnClockLoggingQuality>
      wait_for_logging_quality_clock_{this};
};
}  // namespace forensics

#endif  // SRC_DEVELOPER_FORENSICS_UTILS_UTC_CLOCK_READY_WATCHER_H_
