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

// This file defines a service that sends metrics logs to a server.

#ifndef COMPONENTS_METRICS_METRICS_REPORTING_SERVICE_H_
#define COMPONENTS_METRICS_METRICS_REPORTING_SERVICE_H_

#include <stdint.h>

#include <string>

#include "base/macros.h"
#include "components/metrics/metrics_log_store.h"
#include "components/metrics/reporting_service.h"

class PrefService;
class PrefRegistrySimple;

namespace metrics {

class MetricsServiceClient;

// MetricsReportingService is concrete implementation of ReportingService for
// UMA logs. It uses a MetricsLogStore as its LogStore, reports to the UMA
// endpoint, and logs some histograms with the UMA prefix.
class MetricsReportingService : public ReportingService {
 public:
  // Creates a ReportingService with the given |client|, |local_state|.
  // Does not take ownership of the parameters; instead it stores a weak
  // pointer to each. Caller should ensure that the parameters are valid for
  // the lifetime of this class.
  MetricsReportingService(MetricsServiceClient* client,
                          PrefService* local_state);
  ~MetricsReportingService() override;

  MetricsLogStore* metrics_log_store() { return &metrics_log_store_; }
  const MetricsLogStore* metrics_log_store() const {
    return &metrics_log_store_;
  }

  // Registers local state prefs used by this class.
  static void RegisterPrefs(PrefRegistrySimple* registry);

 private:
  // ReportingService:
  LogStore* log_store() override;
  std::string GetUploadUrl() const override;
  std::string GetInsecureUploadUrl() const override;
  base::StringPiece upload_mime_type() const override;
  MetricsLogUploader::MetricServiceType service_type() const override;
  void LogActualUploadInterval(base::TimeDelta interval) override;
  void LogCellularConstraint(bool upload_canceled) override;
  void LogResponseOrErrorCode(int response_code,
                              int error_code,
                              bool was_https) override;
  void LogSuccess(size_t log_size) override;
  void LogLargeRejection(size_t log_size) override;

  MetricsLogStore metrics_log_store_;

  DISALLOW_COPY_AND_ASSIGN(MetricsReportingService);
};

}  // namespace metrics

#endif  // COMPONENTS_METRICS_METRICS_REPORTING_SERVICE_H_
