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

#include "sync/internal_api/public/internal_components_factory_impl.h"

#include "sync/engine/backoff_delay_provider.h"
#include "sync/engine/syncer.h"
#include "sync/engine/sync_scheduler_impl.h"
#include "sync/sessions/sync_session_context.h"
#include "sync/syncable/on_disk_directory_backing_store.h"

using base::TimeDelta;

namespace syncer {

InternalComponentsFactoryImpl::InternalComponentsFactoryImpl(
    const Switches& switches) : switches_(switches) {
}

InternalComponentsFactoryImpl::~InternalComponentsFactoryImpl() { }

scoped_ptr<SyncScheduler> InternalComponentsFactoryImpl::BuildScheduler(
    const std::string& name,
    sessions::SyncSessionContext* context,
    CancelationSignal* cancelation_signal) {

  scoped_ptr<BackoffDelayProvider> delay(BackoffDelayProvider::FromDefaults());

  if (switches_.backoff_override == BACKOFF_SHORT_INITIAL_RETRY_OVERRIDE)
    delay.reset(BackoffDelayProvider::WithShortInitialRetryOverride());

  return scoped_ptr<SyncScheduler>(new SyncSchedulerImpl(
          name,
          delay.release(),
          context,
          new Syncer(cancelation_signal)));
}

scoped_ptr<sessions::SyncSessionContext>
InternalComponentsFactoryImpl::BuildContext(
    ServerConnectionManager* connection_manager,
    syncable::Directory* directory,
    const std::vector<ModelSafeWorker*>& workers,
    ExtensionsActivity* extensions_activity,
    const std::vector<SyncEngineEventListener*>& listeners,
    sessions::DebugInfoGetter* debug_info_getter,
    TrafficRecorder* traffic_recorder,
    const std::string& invalidation_client_id) {
  return scoped_ptr<sessions::SyncSessionContext>(
      new sessions::SyncSessionContext(
          connection_manager, directory, workers, extensions_activity,
          listeners, debug_info_getter,
          traffic_recorder,
          switches_.encryption_method == ENCRYPTION_KEYSTORE,
          switches_.pre_commit_updates_policy ==
              FORCE_ENABLE_PRE_COMMIT_UPDATE_AVOIDANCE,
          invalidation_client_id));
}

scoped_ptr<syncable::DirectoryBackingStore>
InternalComponentsFactoryImpl::BuildDirectoryBackingStore(
      const std::string& dir_name, const base::FilePath& backing_filepath) {
  return scoped_ptr<syncable::DirectoryBackingStore>(
      new syncable::OnDiskDirectoryBackingStore(dir_name, backing_filepath));
}

InternalComponentsFactory::Switches
InternalComponentsFactoryImpl::GetSwitches() const {
  return switches_;
}

}  // namespace syncer
