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

#ifndef COMPONENTS_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_
#define COMPONENTS_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_

#include <map>

#include "base/scoped_observer.h"
#include "components/sync/driver/sync_service.h"
#include "components/sync/driver/sync_service_observer.h"
#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"

class PrefService;

namespace ukm {

// Observer that monitors whether UKM is allowed for all profiles.
//
// For one profile, UKM is allowed under the following conditions:
// * If unified consent is disabled, then UKM is allowed for the profile iff
//   sync history is active;
// * If unified consent is enabled, then UKM is allowed for the profile iff
//   URL-keyed anonymized data collectiion is enabled.
class SyncDisableObserver
    : public syncer::SyncServiceObserver,
      public unified_consent::UrlKeyedDataCollectionConsentHelper::Observer {
 public:
  SyncDisableObserver();
  ~SyncDisableObserver() override;

  // Starts observing a service for sync disables.
  void ObserveServiceForSyncDisables(syncer::SyncService* sync_service,
                                     PrefService* pref_service);

  // Returns true iff all sync states alllow UKM to be enabled. This means that
  // for all profiles:
  // * If unified consent is disabled, then sync is initialized, connected, has
  //   the HISTORY_DELETE_DIRECTIVES data type enabled, and does not have a
  //   secondary passphrase enabled.
  // * If unified consent is enabled, then URL-keyed anonymized data collection
  //   is enabled for that profile.
  virtual bool SyncStateAllowsUkm();

  // Returns true iff sync is in a state that allows UKM to capture extensions.
  // This means that all profiles have EXTENSIONS data type enabled for syncing.
  virtual bool SyncStateAllowsExtensionUkm();

 protected:
  // Called after state changes and some profile has sync disabled.
  // If |must_purge| is true, sync was disabled for some profile, and
  // local data should be purged.
  virtual void OnSyncPrefsChanged(bool must_purge) = 0;

 private:
  // syncer::SyncServiceObserver:
  void OnStateChanged(syncer::SyncService* sync) override;
  void OnSyncShutdown(syncer::SyncService* sync) override;

  // unified_consent::UrlKeyedDataCollectionConsentHelper::Observer:
  void OnUrlKeyedDataCollectionConsentStateChanged(
      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper)
      override;

  // Recomputes all_profiles_enabled_ state from previous_states_;
  void UpdateAllProfileEnabled(bool must_purge);

  // Returns true iff all sync states in previous_states_ allow UKM.
  // If there are no profiles being observed, this returns false.
  bool CheckSyncStateOnAllProfiles();

  // Returns true iff all sync states in previous_states_ allow extension UKM.
  // If there are no profiles being observed, this returns false.
  bool CheckSyncStateForExtensionsOnAllProfiles();

  // Tracks observed history services, for cleanup.
  ScopedObserver<syncer::SyncService, syncer::SyncServiceObserver>
      sync_observer_;

  enum class DataCollectionState {
    // Matches the case when unified consent feature is disabled
    kIgnored,
    // Unified consent feature is enabled and the user has disabled URL-keyed
    // anonymized data collection.
    kDisabled,
    // Unified consent feature is enabled and the user has enabled URL-keyed
    // anonymized data collection.
    kEnabled
  };

  // State data about sync services that we need to remember.
  struct SyncState {
    // Returns true if this sync state allows UKM:
    // * If unified consent is disabled, then sync is initialized, connected,
    //   has history data type enabled, and does not have a secondary passphrase
    //   enabled.
    // * If unified consent is enabled, then URL-keyed anonymized data
    //   collection is enabled.
    bool AllowsUkm() const;
    // Returns true if |AllowUkm| and if sync extensions are enabled.
    bool AllowsUkmWithExtension() const;

    // If the user has history sync enabled.
    bool history_enabled = false;
    // If the user has extension sync enabled.
    bool extensions_enabled = false;
    // Whether the sync service has been initialized.
    bool initialized = false;
    // Whether the sync service is active and operational.
    bool connected = false;
    // Whether user data is hidden by a secondary passphrase.
    // This is not valid if the state is not initialized.
    bool passphrase_protected = false;

    // Whether anonymized data collection is enabled.
    // Note: This is not managed by sync service. It was added in this enum
    // for convenience.
    DataCollectionState anonymized_data_collection_state =
        DataCollectionState::kIgnored;
  };

  // Updates the sync state for |sync| service. Updates all profiles if needed.
  void UpdateSyncState(
      syncer::SyncService* sync,
      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper);

  // Gets the current state of a SyncService.
  // A non-null |consent_helper| implies that Unified Consent is enabled.
  static SyncState GetSyncState(
      syncer::SyncService* sync,
      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper);

  // The state of the sync services being observed.
  std::map<syncer::SyncService*, SyncState> previous_states_;

  // The list of URL-keyed anonymized data collection consent helpers.
  //
  // Note: UrlKeyedDataCollectionConsentHelper do not rely on sync when
  // unified consent feature is enabled but there must be exactly one per
  // Chromium profile. As there is a single sync service per profile, it is safe
  // to key them by sync service instead of introducing an additional map.
  std::map<
      syncer::SyncService*,
      std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>>
      consent_helpers_;

  // Tracks if UKM is allowed on all profiles after the last state change.
  bool all_sync_states_allow_ukm_ = false;

  // Tracks if extension sync was enabled on all profiles after the last state
  // change.
  bool all_sync_states_allow_extension_ukm_ = false;

  DISALLOW_COPY_AND_ASSIGN(SyncDisableObserver);
};

}  // namespace ukm

#endif  // COMPONENTS_UKM_OBSERVERS_SYNC_DISABLE_OBSERVER_H_
