// Copyright 2015 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_MODEL_ENTITY_CHANGE_H_
#define COMPONENTS_SYNC_MODEL_ENTITY_CHANGE_H_

#include <memory>
#include <string>
#include <vector>

#include "components/sync/protocol/entity_data.h"

namespace syncer {

class EntityChange {
 public:
  enum ChangeType { ACTION_ADD, ACTION_UPDATE, ACTION_DELETE };

  // Note: `storage_key` may be empty, for data types where
  // DataTypeSyncBridge::SupportsGetStorageKey() returns false.
  static std::unique_ptr<EntityChange> CreateAdd(const std::string& storage_key,
                                                 EntityData data);
  static std::unique_ptr<EntityChange> CreateUpdate(
      const std::string& storage_key,
      EntityData data);
  static std::unique_ptr<EntityChange> CreateDelete(
      const std::string& storage_key,
      EntityData data);
  static std::unique_ptr<EntityChange> CreateDeletedCollaborationMembership(
      const std::string& storage_key);

  EntityChange(const EntityChange&) = delete;
  EntityChange& operator=(const EntityChange&) = delete;

  virtual ~EntityChange();

  const std::string& storage_key() const { return storage_key_; }
  ChangeType type() const { return type_; }
  const EntityData& data() const { return data_; }

  // Returns whether the `ACTION_DELETE` change is created due to deleted
  // membership in a collaboration. Only relevant for data types using
  // collaborations and may only be true for `ACTION_DELETE` (meaningless
  // otherwise).
  bool is_deleted_collaboration_membership() const {
    return is_deleted_collaboration_membership_;
  }

 private:
  EntityChange(const std::string& storage_key,
               ChangeType type,
               EntityData data);

  std::string storage_key_;
  ChangeType type_;
  bool is_deleted_collaboration_membership_ = false;
  EntityData data_;
};

using EntityChangeList = std::vector<std::unique_ptr<EntityChange>>;

}  // namespace syncer

#endif  // COMPONENTS_SYNC_MODEL_ENTITY_CHANGE_H_
