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

#include "components/metrics/unsent_log_store_metrics_impl.h"

#include "base/metrics/histogram_functions.h"

namespace metrics {

void UnsentLogStoreMetricsImpl::RecordLogReadStatus(
    UnsentLogStoreMetrics::LogReadStatus status) {
  base::UmaHistogramEnumeration("PrefService.PersistentLogRecallProtobufs",
                                status,
                                UnsentLogStoreMetrics::END_RECALL_STATUS);
}

void UnsentLogStoreMetricsImpl::RecordCompressionRatio(
    size_t compressed_size, size_t original_size) {
  base::UmaHistogramPercentage(
      "UMA.ProtoCompressionRatio",
      static_cast<int>(100 * compressed_size / original_size));
}

void UnsentLogStoreMetricsImpl::RecordDroppedLogSize(size_t size) {
}

void UnsentLogStoreMetricsImpl::RecordDroppedLogsNum(int dropped_logs_num) {
  base::UmaHistogramCounts1M("UMA.UnsentLogs.Dropped", dropped_logs_num);
}

void UnsentLogStoreMetricsImpl::RecordLastUnsentLogMetadataMetrics(
    int unsent_samples_count,
    int sent_samples_count,
    int persisted_size_in_kb) {
  if (!base::FeatureList::IsEnabled(kRecordLastUnsentLogMetadataMetrics))
    return;

  if (unsent_samples_count < 0 || sent_samples_count < 0 ||
      persisted_size_in_kb < 0) {
    return;
  }

  base::UmaHistogramCounts100000("UMA.UnsentLogs.UnsentCount",
                                 unsent_samples_count);
  base::UmaHistogramCounts1M("UMA.UnsentLogs.SentCount", sent_samples_count);
  // Sets 10MB as maximum because the total size of logs in each LogStore is up
  // to 6MB.
  base::UmaHistogramCounts10000("UMA.UnsentLogs.PersistedSizeInKB",
                                persisted_size_in_kb);

  if (sent_samples_count == 0 && unsent_samples_count == 0) {
    base::UmaHistogramPercentage("UMA.UnsentLogs.UnsentPercentage", 0);
  } else {
    base::UmaHistogramPercentage(
        "UMA.UnsentLogs.UnsentPercentage",
        100 * unsent_samples_count /
            (unsent_samples_count + sent_samples_count));
  }
}

}  // namespace metrics
