#ifndef CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_
#define CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/sync_driver/data_type_manager.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "sync/internal_api/public/base/model_type.h"
class ProfileSyncService;
namespace syncer {
struct UserShare;
}  
namespace browser_sync {
class MigrationObserver {
 public:
  virtual void OnMigrationStateChange() = 0;
 protected:
  virtual ~MigrationObserver();
};
class BackendMigrator {
 public:
  enum State {
    IDLE,
    WAITING_TO_START,   
    DISABLING_TYPES,    
                        
                        
                        
    REENABLING_TYPES,   
                        
  };
  
  BackendMigrator(const std::string& name,
                  syncer::UserShare* user_share,
                  ProfileSyncService* service,
                  DataTypeManager* manager,
                  const base::Closure &migration_done_callback);
  virtual ~BackendMigrator();
  
  void MigrateTypes(syncer::ModelTypeSet types);
  void AddMigrationObserver(MigrationObserver* observer);
  bool HasMigrationObserver(MigrationObserver* observer) const;
  void RemoveMigrationObserver(MigrationObserver* observer);
  State state() const;
  
  
  void OnConfigureDone(const DataTypeManager::ConfigureResult& result);
  
  syncer::ModelTypeSet GetPendingMigrationTypesForTest() const;
 private:
  void ChangeState(State new_state);
  
  
  
  
  bool TryStart();
  
  void RestartMigration();
  
  void OnConfigureDoneImpl(const DataTypeManager::ConfigureResult& result);
  const std::string name_;
  syncer::UserShare* user_share_;
  ProfileSyncService* service_;
  DataTypeManager* manager_;
  State state_;
  ObserverList<MigrationObserver> migration_observers_;
  syncer::ModelTypeSet to_migrate_;
  base::Closure migration_done_callback_;
  base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_;
  DISALLOW_COPY_AND_ASSIGN(BackendMigrator);
};
}  
#endif