// Copyright 2015 The Weave 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 LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_
#define LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_

#include <vector>

#include <base/callback_list.h>
#include <base/time/time.h>

namespace base {
class DictionaryValue;
}  // namespace base

namespace weave {

// A simple notification record event to track device state changes.
// The |timestamp| records the time of the state change.
// |changed_properties| contains a property set with the new property values
// which were updated at the time the event was recorded.
struct StateChange {
  StateChange(base::Time time,
              std::unique_ptr<base::DictionaryValue> properties)
      : timestamp{time}, changed_properties{std::move(properties)} {}
  base::Time timestamp;
  std::unique_ptr<base::DictionaryValue> changed_properties;
};

// An abstract interface to StateChangeQueue to record and retrieve state
// change notification events.
class StateChangeQueueInterface {
 public:
  using UpdateID = uint64_t;
  using Token =
      std::unique_ptr<base::CallbackList<void(UpdateID)>::Subscription>;

  // Returns true if the state change notification queue is empty.
  virtual bool IsEmpty() const = 0;

  // Called by StateManager when device state properties are updated.
  virtual bool NotifyPropertiesUpdated(
      base::Time timestamp,
      std::unique_ptr<base::DictionaryValue> changed_properties) = 0;

  // Returns the recorded state changes since last time this method was called.
  virtual std::vector<StateChange> GetAndClearRecordedStateChanges() = 0;

  // Returns an ID of last state change update. Each NotifyPropertiesUpdated()
  // invocation increments this value by 1.
  virtual UpdateID GetLastStateChangeId() const = 0;

  // Subscribes for device state update notifications from cloud server.
  // The |callback| will be called every time a state patch with given ID is
  // successfully received and processed by GCD server.
  // Returns a subscription token. As soon as this token is destroyed, the
  // respective callback is removed from the callback list.
  virtual Token AddOnStateUpdatedCallback(
      const base::Callback<void(UpdateID)>& callback) WARN_UNUSED_RESULT = 0;

  virtual void NotifyStateUpdatedOnServer(UpdateID update_id) = 0;

 protected:
  // No one should attempt do destroy the queue through the interface.
  virtual ~StateChangeQueueInterface() {}
};

}  // namespace weave

#endif  // LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_
