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

#include <map>
#include <set>

#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "sync/internal_api/public/base/invalidator_state.h"
#include "sync/notifier/invalidation_util.h"

namespace base {
class DictionaryValue;
}  // namespace base

namespace syncer {
class InvalidationHandler;
class ObjectIdInvalidationMap;
}  // namespace syncer

namespace invalidation {

class InvalidationLoggerObserver;

// This class is in charge of logging invalidation-related information.
// It is used store the state of the InvalidatorService that owns this object
// and then rebroadcast it to observers than can display it accordingly
// (like a debugging page). This class only stores lightweight state, as in
// which services are registered and listening for certain objects, and the
// status of the InvalidatorService (in order not to increase unnecesary
// memory usage).
//
// Observers can be registered and will be called to be notified of any
// status change immediatly. They can log there the history of what messages
// they receive.

class InvalidationLogger {

 public:
  InvalidationLogger();
  ~InvalidationLogger();

  // Pass through to any registered InvalidationLoggerObservers.
  // We will do local logging here too.
  void OnRegistration(const std::string& details);
  void OnUnregistration(const std::string& details);
  void OnStateChange(const syncer::InvalidatorState& new_state);
  void OnUpdateIds(std::map<std::string, syncer::ObjectIdSet> updated_ids);
  void OnDebugMessage(const base::DictionaryValue& details);
  void OnInvalidation(const syncer::ObjectIdInvalidationMap& details);

  // Triggers messages to be sent to the Observers to provide them with
  // the current state of the logging.
  void EmitContent();

  // Add and remove observers listening for messages.
  void RegisterObserver(InvalidationLoggerObserver* debug_observer);
  void UnregisterObserver(InvalidationLoggerObserver* debug_observer);
  bool IsObserverRegistered(InvalidationLoggerObserver* debug_observer);

 private:
  // Send to every Observer a OnStateChange event with the latest state.
  void EmitState();

  // Send to every Observer many OnUpdateIds events, each with one registrar
  // and every objectId it currently has registered.
  void EmitUpdatedIds();

  // Send to every Observer a vector with the all the current registered
  // handlers.
  void EmitRegisteredHandlers();

  // The list of every observer currently listening for notifications.
  ObserverList<InvalidationLoggerObserver> observer_list_;

  // The last InvalidatorState updated by the InvalidatorService.
  syncer::InvalidatorState last_invalidator_state_;
  base::Time last_invalidator_state_timestamp_;

  // The map that contains every object id that is currently registered
  // and its owner.
  std::map<std::string, syncer::ObjectIdSet> latest_ids_;

  // The map that counts how many invalidations per objectId there has been.
  syncer::ObjectIdCountMap invalidation_count_;

  // The name of all invalidatorHandler registered (note that this is not
  // necessarily the same as the keys of latest_ids_, because they might
  // have not registered any object id).
  std::multiset<std::string> registered_handlers_;

  DISALLOW_COPY_AND_ASSIGN(InvalidationLogger);
};

}  // namespace invalidation

#endif  // COMPONENTS_INVALIDATION_INVALIDATION_LOGGER_H_
