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

#include "components/ntp_snippets/remote/test_utils.h"

#include <memory>

#include "base/memory/ptr_util.h"
#include "components/prefs/testing_pref_service.h"
#include "components/signin/core/browser/account_tracker_service.h"
#include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
#include "components/signin/core/browser/signin_pref_names.h"
#include "components/signin/core/browser/test_signin_client.h"
#include "components/sync/driver/fake_sync_service.h"

namespace ntp_snippets {

namespace test {

FakeSyncService::FakeSyncService()
    : can_sync_start_(true),
      is_sync_active_(true),
      configuration_done_(true),
      is_encrypt_everything_enabled_(false),
      active_data_types_(syncer::HISTORY_DELETE_DIRECTIVES) {}

FakeSyncService::~FakeSyncService() = default;

bool FakeSyncService::CanSyncStart() const {
  return can_sync_start_;
}

bool FakeSyncService::IsSyncActive() const {
  return is_sync_active_;
}

bool FakeSyncService::ConfigurationDone() const {
  return configuration_done_;
}

bool FakeSyncService::IsEncryptEverythingEnabled() const {
  return is_encrypt_everything_enabled_;
}

syncer::ModelTypeSet FakeSyncService::GetActiveDataTypes() const {
  return active_data_types_;
}

RemoteSuggestionsTestUtils::RemoteSuggestionsTestUtils()
    : pref_service_(base::MakeUnique<TestingPrefServiceSyncable>()) {
  AccountTrackerService::RegisterPrefs(pref_service_->registry());

#if defined(OS_CHROMEOS)
  SigninManagerBase::RegisterProfilePrefs(pref_service_->registry());
  SigninManagerBase::RegisterPrefs(pref_service_->registry());
#else
  SigninManager::RegisterProfilePrefs(pref_service_->registry());
  SigninManager::RegisterPrefs(pref_service_->registry());
#endif  // OS_CHROMEOS

  token_service_ = base::MakeUnique<FakeProfileOAuth2TokenService>();
  signin_client_ = base::MakeUnique<TestSigninClient>(pref_service_.get());
  account_tracker_ = base::MakeUnique<AccountTrackerService>();
  account_tracker_->Initialize(signin_client_.get());
  fake_sync_service_ = base::MakeUnique<FakeSyncService>();

  ResetSigninManager();
}

RemoteSuggestionsTestUtils::~RemoteSuggestionsTestUtils() = default;

void RemoteSuggestionsTestUtils::ResetSigninManager() {
#if defined(OS_CHROMEOS)
  fake_signin_manager_ = base::MakeUnique<FakeSigninManagerBase>(
      signin_client_.get(), account_tracker_.get());
#else
  fake_signin_manager_ = base::MakeUnique<FakeSigninManager>(
      signin_client_.get(), token_service_.get(), account_tracker_.get(),
      /*cookie_manager_service=*/nullptr);
#endif
}

}  // namespace test

}  // namespace ntp_snippets
