// Copyright 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#include "android/metrics/AsyncMetricsReporter.h"

#include "android/metrics/MetricsLogging.h"
#include "android/metrics/proto/studio_stats.pb.h"

namespace android {
namespace metrics {

AsyncMetricsReporter::AsyncMetricsReporter(
        MetricsWriter::Ptr writer,
        base::StringView emulatorVersion,
        base::StringView emulatorFullVersion,
        base::StringView qemuVersion)
    : MetricsReporter(true, std::move(writer),
                      emulatorVersion, emulatorFullVersion, qemuVersion),
      mWorkerThread([this]() { worker(); }) {
    D("created");
    mWorkerThread.start();
}

AsyncMetricsReporter::~AsyncMetricsReporter() {
    // Send an empty callback as a stop request.
    D("sending a stop request to worker");
    mCallbackQueue.send({});
    mWorkerThread.wait();
}

void AsyncMetricsReporter::reportConditional(ConditionalCallback callback) {
    if (callback) {
        D("sending a callback for reporting to worker");
        mCallbackQueue.send(std::move(callback));
    }
}

void AsyncMetricsReporter::worker() {
    while (auto cb = mCallbackQueue.receive()) {
        if (!*cb) {
            D("received a stop request");
            break;
        }
        android_studio::AndroidStudioEvent event;
        if ((*cb)(&event)) {
            sendToWriter(&event);
        }
    }
}

}  // namespace metrics
}  // namespace android
