// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SYNC_ENGINE_UPDATE_HANDLER_H_
#define COMPONENTS_SYNC_ENGINE_UPDATE_HANDLER_H_

#include <memory>
#include <vector>

#include "components/sync/base/sync_invalidation.h"
#include "components/sync/engine/syncer_error.h"

namespace sync_pb {
class DataTypeContext;
class DataTypeProgressMarker;
class SyncEntity;
class GetUpdateTriggers;
}  // namespace sync_pb

using SyncEntityList = std::vector<const sync_pb::SyncEntity*>;

namespace syncer {

class StatusController;

// This class represents an entity that can request, receive, and apply updates
// from the sync server.
class UpdateHandler {
 public:
  // Result of a GetUpdates request for a data type that was nudged (contained
  // at least one invalidation hint for the data type). These values are
  // persisted to logs. Entries should not be renumbered and numeric values
  // should never be reused.
  // LINT.IfChange(NudgedUpdateResult)
  enum class NudgedUpdateResult {
    // The data type successfully downloaded at least one entity.
    kSuccess = 0,

    // No entities were downloaded when data type was invalidated.
    kEmptyResponse = 1,

    // The data type failed to download updates during a sync cycle while a
    // GetUpdates request succeeded.
    kDownloadPartialFailure = 2,

    // The whole GetUpdates request failed due to a server error.
    kDownloadRequestServerError = 3,

    // The whole GetUpdates request failed due to a network error.
    kDownloadRequestNetworkError = 4,

    kMaxValue = kDownloadRequestNetworkError,
  };
  // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:NudgedUpdateResult)

  virtual ~UpdateHandler() = default;

  // Returns true if initial sync was performed for this type.
  virtual bool IsInitialSyncEnded() const = 0;

  // Returns the stored progress marker for this type.
  virtual const sync_pb::DataTypeProgressMarker& GetDownloadProgress()
      const = 0;

  // Returns the per-client datatype context.
  virtual const sync_pb::DataTypeContext& GetDataTypeContext() const = 0;

  // Records an incoming invalidation for this type.
  virtual void RecordRemoteInvalidation(
      std::unique_ptr<SyncInvalidation> incoming) = 0;

  // Records a failure during a GetUpdates request.
  virtual void RecordDownloadFailure(
      NudgedUpdateResult failure_result) const = 0;

  // Fill invalidation related fields in GetUpdates request.
  virtual void CollectPendingInvalidations(sync_pb::GetUpdateTriggers* msg) = 0;
  // Returns true if `pending_invalidations_` vector is not empty.
  virtual bool HasPendingInvalidations() const = 0;

  // Processes the contents of a GetUpdates response message.
  //
  // Should be invoked with the progress marker and set of SyncEntities from a
  // single GetUpdates response message.  The progress marker's type must match
  // this update handler's type, and the set of SyncEntities must include all
  // entities of this type found in the response message.
  //
  // In this context, "applicable_updates" means the set of updates belonging to
  // this type.
  virtual void ProcessGetUpdatesResponse(
      const sync_pb::DataTypeProgressMarker& progress_marker,
      const sync_pb::DataTypeContext& mutated_context,
      const SyncEntityList& applicable_updates,
      StatusController* status) = 0;

  // Called whenever any unapplied updates should be applied. This is usually
  // at the end of a sync cycle, but for data types in
  // ApplyUpdatesImmediatelyTypes() it already happens while the download loop
  // is still ongoing.
  virtual void ApplyUpdates(StatusController* status, bool cycle_done) = 0;
};

}  // namespace syncer

#endif  // COMPONENTS_SYNC_ENGINE_UPDATE_HANDLER_H_
