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

#ifndef BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_
#define BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_

#include <stdint.h>

#include <string>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/metrics/enabled_state_provider.h"
#include "components/metrics/metrics_service_client.h"

class PrefService;

namespace metrics {
class MetricsService;
class MetricsStateManager;
class SystemProfileProto;
}

namespace net {
class URLRequestContextGetter;
}  // namespace net

namespace blimp {
namespace engine {

// BlimpMetricsServiceClient provides an implementation of MetricsServiceClient
// tailored for the Blimp engine to support the upload of metrics information
// from the engine.
// Metrics are always turned on.
class BlimpMetricsServiceClient : public metrics::MetricsServiceClient,
                                  public metrics::EnabledStateProvider {
 public:
  // PrefService ownership is retained by the caller.
  // The request_context_getter is a system request context.
  // Both must remain valid for client lifetime.
  BlimpMetricsServiceClient(
      PrefService* pref_service,
      scoped_refptr<net::URLRequestContextGetter> request_context_getter);
  ~BlimpMetricsServiceClient() override;

  // metrics::MetricsServiceClient implementation.
  metrics::MetricsService* GetMetricsService() override;
  void SetMetricsClientId(const std::string& client_id) override;
  int32_t GetProduct() override;
  std::string GetApplicationLocale() override;
  bool GetBrand(std::string* brand_code) override;
  metrics::SystemProfileProto::Channel GetChannel() override;
  std::string GetVersionString() override;
  void OnLogUploadComplete() override;
  void InitializeSystemProfileMetrics(
      const base::Closure& done_callback) override;
  void CollectFinalMetricsForLog(const base::Closure& done_callback) override;
  std::unique_ptr<metrics::MetricsLogUploader> CreateUploader(
      const base::Callback<void(int)>& on_upload_complete) override;
  base::TimeDelta GetStandardUploadInterval() override;
  metrics::EnableMetricsDefault GetMetricsReportingDefaultState() override;

  // metrics::EnabledStateProvider implementation.
  // Returns if consent is given for the MetricsService to record metrics
  // information for the client. Always true.
  bool IsConsentGiven() override;

 private:
  // Used by NetMetricsLogUploader to create log-upload requests.
  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;

  std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager_;
  std::unique_ptr<metrics::MetricsService> metrics_service_;

  DISALLOW_COPY_AND_ASSIGN(BlimpMetricsServiceClient);
};

}  // namespace engine
}  // namespace blimp

#endif  // BLIMP_ENGINE_APP_BLIMP_METRICS_SERVICE_CLIENT_H_
