// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_METRICS_STRUCTURED_HISTOGRAM_UTIL_H_
#define COMPONENTS_METRICS_STRUCTURED_HISTOGRAM_UTIL_H_
#include "components/prefs/persistent_pref_store.h"

namespace metrics::structured {

// Possible internal errors of the structured metrics system. These are events
// we expect to never see, so only the absolute counts should be looked at, the
// bucket proportion doesn't make sense. These values are persisted to logs.
// Entries should not be renumbered and numeric values should never be reused.
enum class StructuredMetricsError {
  kMissingKey = 0,
  kWrongKeyLength = 1,
  kMissingLastRotation = 2,
  kMissingRotationPeriod = 3,
  kFailedUintConversion = 4,
  kKeyReadError = 5,
  kKeyParseError = 6,
  kKeyWriteError = 7,
  kKeySerializationError = 8,
  kEventReadError = 9,
  kEventParseError = 10,
  kEventWriteError = 11,
  kEventSerializationError = 12,
  kUninitializedClient = 13,
  kInvalidEventParsed = 14,
  kMaxValue = kInvalidEventParsed,
};

// Whether a single event was recorded correctly, or otherwise what error state
// occurred. These values are persisted to logs. Entries should not be
// renumbered and numeric values should never be reused.
enum class EventRecordingState {
  kRecorded = 0,
  kProviderUninitialized = 1,
  kRecordingDisabled = 2,
  kProviderMissing = 3,
  kProjectDisallowed = 4,
  kMaxValue = kProjectDisallowed,
};

// Describes the action taken by KeyData::ValidateAndGetKey on a particular user
// event key. A key can either be valid with no action taken, missing and so
// created, or out of its rotation period and so re-created. These values are
// persisted to logs. Entries should not be renumbered and numeric values should
// never be reused.
enum class KeyValidationState {
  kValid = 0,
  kCreated = 1,
  kRotated = 2,
  kMaxValue = kRotated,
};

void LogInternalError(StructuredMetricsError error);

void LogEventRecordingState(EventRecordingState state);

void LogKeyValidation(KeyValidationState state);

// Log how many structured metrics events were contained in a call to
// ProvideCurrentSessionData.
void LogNumEventsInUpload(int num_events);

// Logs that an event was recorded using the mojo API.
void LogIsEventRecordedUsingMojo(bool used_mojo_api);

// Logs the number of events that were recorded before device and user
// cryptographic keys have been loaded to hash events. These events will be kept
// in memory.
void LogNumEventsRecordedBeforeInit(int num_events);

// Logs the number of files processed per external metrics scan.
void LogNumFilesPerExternalMetricsScan(int num_files);

// Logs the file size of an event.
void LogEventFileSizeKB(int64_t file_size_kb);

// Logs the serialized size of an event when it is recorded in bytes.
void LogEventSerializedSizeBytes(int64_t event_size_bytes);

// Logs the StructuredMetrics uploaded size to UMA in bytes.
void LogUploadSizeBytes(int64_t upload_size_bytes);

// Logs the number of external metrics were scanned for an upload.
void LogExternalMetricsScanInUpload(int num_scans);

}  // namespace metrics::structured

#endif  // COMPONENTS_METRICS_STRUCTURED_HISTOGRAM_UTIL_H_
