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

#include "./logging.h"
#include "encoder/observation_store.h"

namespace cobalt {
namespace encoder {

ObservationStore::ObservationStore(size_t max_bytes_per_observation,
                                   size_t max_bytes_per_envelope,
                                   size_t max_bytes_total)
    : max_bytes_per_observation_(max_bytes_per_observation),
      max_bytes_per_envelope_(max_bytes_per_envelope),
      max_bytes_total_(max_bytes_total),
      almost_full_threshold_(0.6 * max_bytes_total_) {
  CHECK_LE(max_bytes_per_observation_, max_bytes_per_envelope_);
  CHECK_LE(max_bytes_per_envelope_, max_bytes_total_);
  CHECK_LE(0, max_bytes_per_envelope_);
}

bool ObservationStore::IsAlmostFull() const {
  return Size() > almost_full_threshold_;
}

std::string ObservationStore::StatusDebugString(StoreStatus status) {
  switch (status) {
    case kOk:
      return "kOk";

    case kObservationTooBig:
      return "kObservationTooBig";

    case kStoreFull:
      return "kStoreFull";

    case kWriteFailed:
      return "kWriteFailed";
  }
}

}  // namespace encoder
}  // namespace cobalt
