// 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 COBALT_SRC_LOGGER_EVENT_VECTOR_INDEX_H_
#define COBALT_SRC_LOGGER_EVENT_VECTOR_INDEX_H_

#include <google/protobuf/repeated_field.h>

#include "src/lib/statusor/statusor.h"
#include "src/registry/metric_definition.pb.h"

namespace cobalt::logger {

// Returns an integer representing |event_vector| with respect to the metric dimensions of
// |metric_def|, or else returns an error if |event_vector| is not a valid event vector for
// |metric_def|.
//
// If |metric_def| has M metric dimensions, and if n_j is the number of valid event codes for
// dimension j, then N := (n_1 * ... * n_M) is the number of valid event vectors for |metric_def|.
// EventVectorToIndex is a 1-to-1 map from the set of valid event vectors onto the range [0, N-1].
lib::statusor::StatusOr<uint64_t> EventVectorToIndex(std::vector<uint32_t> event_vector,
                                                     const MetricDefinition &metric_def);

// Returns the event vector corresponding to |index| with respect to |metric_dimensions|, or else
// returns an error if |index| does not correspond to a valid event vector.
//
// This function is inverse to EventVectorToIndex() if |metric_dimensions| are the MetricDimensions
// of the MetricDefinition passed to EventVectorToIndex(). With N as defined in the comment on
// EventVectorToIndex(), any |index| in the range [0, N-1] should result in an OK status.
lib::statusor::StatusOr<std::vector<uint32_t>> EventVectorFromIndex(
    uint64_t index,
    const google::protobuf::RepeatedPtrField<MetricDefinition::MetricDimension> &metric_dimensions);

// A helper function which returns the number of valid event codes associated to |metric_dim|.
// There are 2 cases:
//
// - If a max_event_code is specified in |metric_dim|, then every integer in the
//   range [0, max_event_code] is a valid event code.
//
// - Otherwise, an event code is valid if and only if it is enumerated in |metric_dim|.
uint64_t GetNumEventCodes(const MetricDefinition::MetricDimension &metric_dim);

// A helper function which returns the number of valid event vectors associated to
// |metric_dimensions|.
uint64_t GetNumEventVectors(
    const google::protobuf::RepeatedPtrField<MetricDefinition::MetricDimension> &metric_dimensions);

// A helper function which returns the index of |event_code| in an enumeration of the valid event
// codes for |metric_dim|, or else returns an error if |event_code| is not a valid event code for
// |metric_dim|.
lib::statusor::StatusOr<uint64_t> EventCodeToIndexForDimension(
    uint32_t event_code, const MetricDefinition::MetricDimension &metric_dim);

// A helper function which, given an |index| into an enumeration of the valid event codes for
// |metric_dim|, returns the corresponding event code. An error is returned if |index| does not
// correspond to a valid event code of |metric_dim|.
lib::statusor::StatusOr<uint32_t> EventCodeFromIndexForDimension(
    uint64_t index, const MetricDefinition::MetricDimension &metric_dim);

}  // namespace cobalt::logger

#endif  // COBALT_SRC_LOGGER_EVENT_VECTOR_INDEX_H_
