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

#include "src/virtualization/tests/periodic_logger.h"

#include <lib/syslog/cpp/macros.h>
#include <lib/zx/clock.h>

PeriodicLogger::PeriodicLogger(std::string operation, zx::duration logging_interval)
    : start_time_(zx::clock::get_monotonic()),
      operation_(std::move(operation)),
      logging_interval_(logging_interval),
      last_log_time_(start_time_) {}

PeriodicLogger::~PeriodicLogger() {
  // Only print a final message if we already printed a progress message.
  if (message_printed_) {
    FX_LOGS(INFO) << operation_ << ": Finished after "
                  << (zx::clock::get_monotonic() - start_time_).to_secs() << "s.";
  }
}

// Print a log message about the current operation if enough time has passed
// since the operation started / since the last log message.
void PeriodicLogger::LogIfRequired() {
  const zx::time now = zx::clock::get_monotonic();
  if (now - last_log_time_ >= logging_interval_) {
    FX_LOGS(INFO) << operation_ << ": Still waiting... (" << (now - start_time_).to_secs()
                  << "s passed)";
    last_log_time_ = now;
    message_printed_ = true;
  }
}
