/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2014  Regents of the University of California,
 *                     Arizona Board of Regents,
 *                     Colorado State University,
 *                     University Pierre & Marie Curie, Sorbonne University,
 *                     Washington University in St. Louis,
 *                     Beijing Institute of Technology,
 *                     The University of Memphis
 *
 * This file is part of NFD (Named Data Networking Forwarding Daemon).
 * See AUTHORS.md for complete list of NFD authors and contributors.
 *
 * NFD is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 **/

#ifndef NFD_CORE_FACE_MONITOR_HPP
#define NFD_CORE_FACE_MONITOR_HPP

#include "common.hpp"

#include <ndn-cpp-dev/management/nfd-face-event-notification.hpp>

namespace ndn {
class Face;
struct PendingInterestId;
}

namespace nfd {

using ndn::nfd::FaceEventNotification;

/**
 * \brief Helper class to subscribe to face notification events
 *
 * \todo Write test cases
 */
class FaceMonitor : noncopyable
{
public:
  typedef function<void(const ndn::nfd::FaceEventNotification&)> NotificationCallback;
  typedef function<void()> TimeoutCallback;

  typedef std::vector<NotificationCallback> NotificationCallbacks;
  typedef std::vector<TimeoutCallback> TimeoutCallbacks;

  explicit
  FaceMonitor(ndn::Face& face);

  ~FaceMonitor();

  /** \brief Stops all notifications. This method  doesn't remove registered callbacks.
   */
  void
  stopNotifications();

  /** \brief Resumes notifications for added subscribers.
   */
  void
  startNotifications();

  /** \brief Removes all notification subscribers.
   */
  void
  removeAllSubscribers();

  /** \brief Adds a notification subscriber. This method doesn't return on timeouts.
   */
  void
  addSubscriber(const NotificationCallback& notificationCallback);

  /** \brief Adds a notification subscriber.
   */
  void
  addSubscriber(const NotificationCallback& notificationCallback,
                const TimeoutCallback&  timeoutCallback);

private:
  void
  onTimeout();

  void
  onNotification(const Data& data);

private:
  ndn::Face& m_face;
  uint64_t m_lastSequence;
  bool m_isStopped;
  NotificationCallbacks m_notificationCallbacks;
  TimeoutCallbacks m_timeoutCallbacks;
  const ndn::PendingInterestId* m_lastInterestId;
};

} // namespace nfd

#endif // NFD_CORE_FACE_MONITOR_HPP
