// Copyright 2019 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 COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_
#define COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_

#include <memory>

#include "base/time/time.h"
#include "components/metrics/metrics_provider.h"
#include "components/sync/driver/sync_service.h"
#include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"

namespace base {
struct Feature;
}

namespace metrics {

// Provider of the synced user’s noised birth year and gender to the UMA metrics
// server. The synced user's birth year and gender were provided to Google when
// the user created their Google account, to use in accordance with Google's
// privacy policy. The provided birth year and gender are used in aggregate and
// anonymized form to measure usage of Chrome features by age groups and gender
// - helping Chrome ensure features are useful to a wide range of users. Users
// can avoid aggregation of usage data by birth year and gender by either a)
// turning off sending usage statistics to Google or b) turning off sync.
class DemographicMetricsProvider : public MetricsProvider {
 public:
  // Interface that represents the client that retrieves Profile information.
  class ProfileClient {
   public:
    virtual ~ProfileClient() = default;

    // Gets the total number of profiles that are on disk (loaded + not loaded)
    // for the browser.
    virtual int GetNumberOfProfilesOnDisk() = 0;

    // Gets a weak pointer to the ProfileSyncService of the Profile.
    virtual syncer::SyncService* GetSyncService() = 0;

    // Gets the network time that represents now.
    virtual base::Time GetNetworkTime() const = 0;
  };

  explicit DemographicMetricsProvider(
      std::unique_ptr<ProfileClient> profile_client);
  ~DemographicMetricsProvider() override;

  // MetricsProvider:
  void ProvideCurrentSessionData(
      ChromeUserMetricsExtension* uma_proto) override;

  // Feature switch to report user's noised birth year and gender.
  static const base::Feature kDemographicMetricsReporting;

 private:
  std::unique_ptr<ProfileClient> profile_client_;

  DISALLOW_COPY_AND_ASSIGN(DemographicMetricsProvider);
};

}  // namespace metrics

#endif  // COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_