// Copyright 2020 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.

#ifndef SRC_COBALT_BIN_APP_METRIC_EVENT_LOGGER_IMPL_H_
#define SRC_COBALT_BIN_APP_METRIC_EVENT_LOGGER_IMPL_H_

#include <fuchsia/cobalt/cpp/fidl.h>

#include "third_party/cobalt/src/logger/logger.h"

namespace cobalt {

// Implementations of the MetricEventLogger fidl interfaces.
//
// To test run:
//    fx set --with-base //bundles:tools,//src/cobalt/bin:cobalt_tests;
//    fx run-test-component cobalt_testapp_no_network
class MetricEventLoggerImpl : public fuchsia::cobalt::MetricEventLogger {
 public:
  MetricEventLoggerImpl(std::unique_ptr<logger::LoggerInterface> logger);

 private:
  void LogOccurrence(uint32_t metric_id, uint64_t count, ::std::vector<uint32_t> event_codes,
                     fuchsia::cobalt::MetricEventLogger::LogOccurrenceCallback callback) override;

  void LogInteger(uint32_t metric_id, int64_t value, ::std::vector<uint32_t> event_codes,
                  fuchsia::cobalt::MetricEventLogger::LogIntegerCallback callback) override;

  void LogIntegerHistogram(
      uint32_t metric_id, std::vector<fuchsia::cobalt::HistogramBucket> histogram,
      ::std::vector<uint32_t> event_codes,
      fuchsia::cobalt::MetricEventLogger::LogIntegerHistogramCallback callback) override;

  void LogString(uint32_t metric_id, std::string string_value, ::std::vector<uint32_t> event_codes,
                 fuchsia::cobalt::MetricEventLogger::LogStringCallback callback) override;

  void LogMetricEvents(
      std::vector<fuchsia::cobalt::MetricEvent> events,
      fuchsia::cobalt::MetricEventLogger::LogMetricEventsCallback callback) override;

  void LogCustomEvent(uint32_t metric_id,
                      std::vector<fuchsia::cobalt::CustomEventValue> event_values,
                      fuchsia::cobalt::MetricEventLogger::LogCustomEventCallback callback) override;

 private:
  fuchsia::cobalt::Status LogMetricEvent(fuchsia::cobalt::MetricEvent event);

  std::unique_ptr<logger::LoggerInterface> logger_;
};

}  // namespace cobalt

#endif  // SRC_COBALT_BIN_APP_METRIC_EVENT_LOGGER_IMPL_H_
