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

#ifndef PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_
#define PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_

#include <lib/async/dispatcher.h>
#include <lib/component/cpp/startup_context.h>
#include <lib/fit/defer.h>
#include <lib/fit/function.h>
#include <src/lib/fxl/memory/ref_ptr.h>

namespace modular {

// Metric IDs that Cobalt requires to identify the data we are logging.
// These are not events (events are tracked through ModularEvents index metric).
// For information on datatypes and structure of each of these metrics, see
// https://cobalt-analytics.googlesource.com/config/+/master/fuchsia/module_usage_tracking/config.yaml
// Next enum value: 6
enum class CobaltMetric : uint32_t {
  MODULE_LAUNCHED = 1,
  MODULE_PAIRS_IN_STORY = 2,
  MODULAR_EVENTS = 3,
  MODULE_LAUNCH_LATENCY = 4,
  STORY_LAUNCH_LATENCY = 5,
  SESSION_AGENT_EVENT = 6,
};

// The events to report.
// Next enum value: 2
enum class ModularEvent : uint32_t {
  BOOTED_TO_BASEMGR = 0,
  BOOTED_TO_SESSIONMGR = 1,
};

// The sesssion agent events to report.
// Next enum value: 2
enum class SessionAgentEvent : uint32_t {
  CRASH = 0,
  CRASH_LIMIT = 1,
};

// Cobalt initialization. When cobalt is not needed, the returned object must be
// deleted. This method must not be called again until then.
fit::deferred_action<fit::closure> InitializeCobalt(
    async_dispatcher_t* dispatcher, component::StartupContext* context);

// Report a modular event to Cobalt.
void ReportEvent(ModularEvent event);

// Report a module launch time duration to Cobalt.
void ReportModuleLaunchTime(std::string module_url, zx::duration time);

// Report a story launch time duration to Cobalt.
void ReportStoryLaunchTime(zx::duration time);

void ReportSessionAgentEvent(const std::string& url, SessionAgentEvent event);

}  // namespace modular

#endif  // PERIDOT_BIN_BASEMGR_COBALT_COBALT_H_
