// Copyright 2014 The Chromium OS 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 METRICS_SERIALIZATION_METRIC_SAMPLE_H_
#define METRICS_SERIALIZATION_METRIC_SAMPLE_H_

#include <string>

#include "base/gtest_prod_util.h"
#include "base/macros.h"

namespace metrics {

// This class is used by libmetrics (ChromeOS) to serialize
// and deserialize measurements to send them to a metrics sending service.
// It is meant to be a simple container with serialization functions.
class MetricSample {
 public:
  // Types of metric sample used.
  enum SampleType {
    INVALID,
    CRASH,
    HISTOGRAM,
    LINEAR_HISTOGRAM,
    SPARSE_HISTOGRAM,
    USER_ACTION,
  };

  // Constructs an invalid sample. Use the factory functions below to create
  // samples carrying actual data.
  MetricSample() {}
  ~MetricSample() = default;

  // Allow copy and move construction. Assignment is not available because all
  // data members are constant.
  MetricSample(const MetricSample& other) = default;
  MetricSample(MetricSample&& other) = default;

  // Returns true if the sample is valid (can be serialized without ambiguity).
  //
  // This function should be used to filter bad samples before serializing them.
  bool IsValid() const;

  // Getters for type and name. All types of metrics have these so we do not
  // need to check the type.
  SampleType type() const { return type_; }
  const std::string& name() const { return name_; }

  // Getters for sample, min, max, bucket_count, num_samples.
  // Check the metric type to make sure the request make sense. (ex: a crash
  // sample does not have a bucket_count so we crash if we call bucket_count()
  // on it.)
  int sample() const;
  int min() const;
  int max() const;
  int bucket_count() const;
  int num_samples() const;

  // Returns a serialized version of the sample.
  //
  // The serialized message for each type is:
  // crash: crash\0|name_|\0
  // user action: useraction\0|name_|\0
  // histogram: histogram\0|name_| |sample_| |min_| |max_| |bucket_count_|\0
  // sparsehistogram: sparsehistogram\0|name_| |sample_|\0
  // linearhistogram: linearhistogram\0|name_| |sample_| |max_|\0
  std::string ToString() const;

  // Builds a crash sample.
  static MetricSample CrashSample(const std::string& crash_name);

  // Builds a histogram sample.
  // Chrome doesn't support repeated samples yet, non-one counts
  // can only be used (outside of unit tests) when
  // conditional compile flag USE_METRICS_UPLOADER is 1.
  static MetricSample HistogramSample(const std::string& histogram_name,
                                      int sample,
                                      int min,
                                      int max,
                                      int bucket_count,
                                      int num_samples = 1);
  // Deserializes a histogram sample.
  static MetricSample ParseHistogram(const std::string& serialized);

  // Builds a sparse histogram sample.
  static MetricSample SparseHistogramSample(const std::string& histogram_name,
                                            int sample);
  // Deserializes a sparse histogram sample.
  static MetricSample ParseSparseHistogram(const std::string& serialized);

  // Builds a linear histogram sample.
  static MetricSample LinearHistogramSample(const std::string& histogram_name,
                                            int sample,
                                            int max);
  // Deserializes a linear histogram sample.
  static MetricSample ParseLinearHistogram(const std::string& serialized);

  // Builds a user action sample.
  static MetricSample UserActionSample(const std::string& action_name);

  // Returns true if sample and this object represent the same sample (type,
  // name, sample, min, max, bucket_count match).
  bool IsEqual(const MetricSample& sample) const;

 private:
  MetricSample(SampleType sample_type,
               const std::string& metric_name,
               const int sample,
               const int min,
               const int max,
               const int bucket_count,
               const int num_samples = 1);

  const SampleType type_ = INVALID;
  const std::string name_;
  const int sample_ = 0;
  const int min_ = 0;
  const int max_ = 0;
  const int bucket_count_ = 0;
  const int num_samples_ = 0;
};

}  // namespace metrics

#endif  // METRICS_SERIALIZATION_METRIC_SAMPLE_H_
