// Copyright (c) 2012 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_BROWSER_SYNC_PROFILE_SYNC_COMPONENTS_FACTORY_IMPL_H__
#define COMPONENTS_BROWSER_SYNC_PROFILE_SYNC_COMPONENTS_FACTORY_IMPL_H__

#include <memory>
#include <string>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "components/sync/base/model_type.h"
#include "components/sync/driver/sync_api_component_factory.h"
#include "components/version_info/version_info.h"

namespace syncer {
class ModelTypeController;
class ModelTypeControllerDelegate;
class SyncService;
}

namespace autofill {
class AutofillWebDataService;
}

namespace password_manager {
class PasswordStore;
}

namespace sync_bookmarks {
class BookmarkSyncService;
}

namespace browser_sync {

class BrowserSyncClient;

class ProfileSyncComponentsFactoryImpl
    : public syncer::SyncApiComponentFactory {
 public:
  ProfileSyncComponentsFactoryImpl(
      BrowserSyncClient* sync_client,
      version_info::Channel channel,
      const char* history_disabled_pref,
      const scoped_refptr<base::SequencedTaskRunner>& ui_thread,
      const scoped_refptr<base::SequencedTaskRunner>& db_thread,
      const scoped_refptr<autofill::AutofillWebDataService>&
          web_data_service_on_disk,
      const scoped_refptr<autofill::AutofillWebDataService>&
          web_data_service_in_memory,
      const scoped_refptr<password_manager::PasswordStore>& password_store,
      sync_bookmarks::BookmarkSyncService* bookmark_sync_service);
  ~ProfileSyncComponentsFactoryImpl() override;

  // Creates and returns enabled datatypes and their controllers.
  // |disabled_types| allows callers to prevent certain types from being
  // created (e.g. to honor command-line flags).
  syncer::DataTypeController::TypeVector CreateCommonDataTypeControllers(
      syncer::ModelTypeSet disabled_types,
      syncer::SyncService* sync_service);

  // SyncApiComponentFactory implementation:
  std::unique_ptr<syncer::DataTypeManager> CreateDataTypeManager(
      syncer::ModelTypeSet initial_types,
      const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
          debug_info_listener,
      const syncer::DataTypeController::TypeMap* controllers,
      const syncer::DataTypeEncryptionHandler* encryption_handler,
      syncer::ModelTypeConfigurer* configurer,
      syncer::DataTypeManagerObserver* observer) override;
  std::unique_ptr<syncer::SyncEngine> CreateSyncEngine(
      const std::string& name,
      invalidation::InvalidationService* invalidator,
      const base::WeakPtr<syncer::SyncPrefs>& sync_prefs) override;
  syncer::SyncApiComponentFactory::SyncComponents CreateBookmarkSyncComponents(
      std::unique_ptr<syncer::DataTypeErrorHandler> error_handler,
      syncer::UserShare* user_share) override;

 private:
  // Factory function for ModelTypeController instances for models living on
  // |ui_thread_|.
  std::unique_ptr<syncer::ModelTypeController>
  CreateModelTypeControllerForModelRunningOnUIThread(syncer::ModelType type);

  // Factory function for ModelTypeControllerDelegate instances for models
  // living in |ui_thread_| that have their delegate accessible via SyncClient.
  std::unique_ptr<syncer::ModelTypeControllerDelegate>
  CreateForwardingControllerDelegate(syncer::ModelType type);

  // Factory function for ModelTypeController instances for wallet-related
  // datatypes, which live in |db_thread_| and have a delegate accessible via
  // AutofillWebDataService.
  std::unique_ptr<syncer::ModelTypeController> CreateWalletModelTypeController(
      syncer::ModelType type,
      const base::RepeatingCallback<
          base::WeakPtr<syncer::ModelTypeControllerDelegate>(
              autofill::AutofillWebDataService*)>& delegate_from_web_data,
      syncer::SyncService* sync_service);
  // Same as above, but supporting STORAGE_IN_MEMORY implemented as an
  // independent AutofillWebDataService, namely |web_data_service_in_memory_|.
  std::unique_ptr<syncer::ModelTypeController>
  CreateWalletModelTypeControllerWithInMemorySupport(
      syncer::ModelType type,
      const base::RepeatingCallback<
          base::WeakPtr<syncer::ModelTypeControllerDelegate>(
              autofill::AutofillWebDataService*)>& delegate_from_web_data,
      syncer::SyncService* sync_service);

  // Client/platform specific members.
  BrowserSyncClient* const sync_client_;
  const version_info::Channel channel_;
  const char* history_disabled_pref_;
  const scoped_refptr<base::SequencedTaskRunner> ui_thread_;
  const scoped_refptr<base::SequencedTaskRunner> db_thread_;
  const scoped_refptr<autofill::AutofillWebDataService>
      web_data_service_on_disk_;
  const scoped_refptr<autofill::AutofillWebDataService>
      web_data_service_in_memory_;
  const scoped_refptr<password_manager::PasswordStore> password_store_;
  sync_bookmarks::BookmarkSyncService* const bookmark_sync_service_;

  DISALLOW_COPY_AND_ASSIGN(ProfileSyncComponentsFactoryImpl);
};

}  // namespace browser_sync

#endif  // COMPONENTS_BROWSER_SYNC_PROFILE_SYNC_COMPONENTS_FACTORY_IMPL_H__
