// 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(UploadScheduleConfig config)
    : current_interval_(config.initial_interval),
      target_interval_(config.target_interval),
      min_interval_(config.min_interval),
      jitter_(config.jitter) {
  CHECK_GE(jitter_, 0);
  CHECK_LT(jitter_, 1);
  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(UploadScheduleConfig{target_interval, min_interval, target_interval, 0}) {}

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_;
    }
  }
  int64_t interval_count = std::chrono::duration_cast<std::chrono::seconds>(interval).count();
  if (interval_count == 0) {
    return interval;
  }

  // Generate a random offset between [-n, n):  n = jitter*current_interval.
  auto unscaled_offset = static_cast<float>(rand() % (2 * interval_count) - interval_count);
  std::chrono::seconds offset = std::chrono::seconds(static_cast<int>(unscaled_offset * jitter_));
  return interval + offset;
}

}  // namespace cobalt::uploader
