// Copyright 2018 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/uploader/upload_scheduler.h"

namespace cobalt::uploader {

// Definition of the static constant declared in shipping_manager.h.
// This must be less than 2^31. There appears to be a bug in
// std::condition_variable::wait_for() in which setting the wait time to
// std::chrono::seconds::max() effectively sets the wait time to zero.
constexpr std::chrono::seconds UploadScheduler::kMaxSeconds(999999999);

UploadScheduler::UploadScheduler(std::chrono::seconds target_interval,
                                 std::chrono::seconds min_interval,
                                 std::chrono::seconds initial_interval)
    : current_interval_(initial_interval),
      target_interval_(target_interval),
      min_interval_(min_interval) {
  CHECK_GE(min_interval.count(), 0);
  CHECK_LE(current_interval_.count(), target_interval_.count());
  CHECK_LE(min_interval_.count(), target_interval_.count());
  CHECK_LE(target_interval.count(), kMaxSeconds.count());
}

UploadScheduler::UploadScheduler(std::chrono::seconds target_interval,
                                 std::chrono::seconds min_interval)
    : UploadScheduler(target_interval, min_interval, target_interval) {}

std::chrono::seconds UploadScheduler::Interval() {
  auto interval = current_interval_;
  if (current_interval_ < target_interval_) {
    current_interval_ *= 2;
    if (current_interval_ >= target_interval_) {
      current_interval_ = target_interval_;
    }
  }
  return interval;
}

}  // namespace cobalt::uploader
