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

#include <cobalt-client/cpp/counter-internal.h>
#include <cobalt-client/cpp/counter.h>

namespace cobalt_client {
namespace internal {

BaseCounter::BaseCounter(BaseCounter&& other) : counter_(other.Exchange(0)) {}

RemoteCounter::RemoteCounter(uint32_t metric_id, const fbl::Vector<Metadata>& metadata)
    : BaseCounter(), buffer_(metadata), metric_id_(metric_id) {
    *buffer_.mutable_event_data() = 0;
}

RemoteCounter::RemoteCounter(RemoteCounter&& other)
    : BaseCounter(fbl::move(other)), buffer_(fbl::move(other.buffer_)),
      metric_id_(other.metric_id_) {}

bool RemoteCounter::Flush(const RemoteCounter::FlushFn& flush_handler) {
    if (!buffer_.TryBeginFlush()) {
        return false;
    }
    // Write the current value of the counter to the buffer, and reset it to 0.
    *buffer_.mutable_event_data() = static_cast<uint32_t>(this->Exchange());
    flush_handler(metric_id_, buffer_, fbl::BindMember(&buffer_, &EventBuffer::CompleteFlush));
    return true;
}
} // namespace internal

Counter::Counter(internal::RemoteCounter* remote_counter) : remote_counter_(remote_counter) {}

void Counter::Increment(Counter::Count value) {
    remote_counter_->Increment(value);
}

Counter::Count Counter::GetRemoteCount() const {
    return remote_counter_->Load();
}

} // namespace cobalt_client
