// Copyright 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 SYNC_PROTOCOL_SYNC_PROTOCOL_ERROR_H_
#define SYNC_PROTOCOL_SYNC_PROTOCOL_ERROR_H_

#include <string>

#include "base/values.h"
#include "sync/base/sync_export.h"
#include "sync/internal_api/public/base/model_type.h"

namespace syncer{

enum SyncProtocolErrorType {
  // Success case.
  SYNC_SUCCESS,

  // Birthday does not match that of the server.
  NOT_MY_BIRTHDAY,

  // Server is busy. Try later.
  THROTTLED,

  // Clear user data is being currently executed by the server.
  CLEAR_PENDING,

  // Server cannot service the request now.
  TRANSIENT_ERROR,

  // Server does not wish the client to retry any more until the action has
  // been taken.
  NON_RETRIABLE_ERROR,

  // Indicates the datatypes have been migrated and the client should resync
  // them to get the latest progress markers.
  MIGRATION_DONE,

  // Invalid Credential.
  INVALID_CREDENTIAL,

  // An administrator disabled sync for this domain.
  DISABLED_BY_ADMIN,

  // Client told to stop syncing this device and roll back local data.
  USER_ROLLBACK,

  // The default value.
  UNKNOWN_ERROR
};

enum ClientAction {
  // Upgrade the client to latest version.
  UPGRADE_CLIENT,

  // Clear user data and setup sync again.
  CLEAR_USER_DATA_AND_RESYNC,

  // Set the bit on the account to enable sync.
  ENABLE_SYNC_ON_ACCOUNT,

  // Stop sync and restart sync.
  STOP_AND_RESTART_SYNC,

  // Wipe this client of any sync data.
  DISABLE_SYNC_ON_CLIENT,

  // Account is disabled by admin. Stop sync, clear prefs and show message on
  // settings page that account is disabled.
  STOP_SYNC_FOR_DISABLED_ACCOUNT,

  // Disable sync and roll back local model to pre-sync state.
  DISABLE_SYNC_AND_ROLLBACK,

  // Generated by SyncRollbackManager to notify ProfileSyncService that
  // rollback is finished.
  ROLLBACK_DONE,

  // The default. No action.
  UNKNOWN_ACTION
};

struct SYNC_EXPORT SyncProtocolError {
  SyncProtocolErrorType error_type;
  std::string error_description;
  std::string url;
  ClientAction action;
  ModelTypeSet error_data_types;
  SyncProtocolError();
  ~SyncProtocolError();
  base::DictionaryValue* ToValue() const;
};

SYNC_EXPORT const char* GetSyncErrorTypeString(SyncProtocolErrorType type);
SYNC_EXPORT const char* GetClientActionString(ClientAction action);
}  // namespace syncer
#endif  // SYNC_PROTOCOL_SYNC_PROTOCOL_ERROR_H_

