/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (C) 2014 Named Data Networking Project
 * See COPYING for copyright and distribution information.
 */

#ifndef NFD_MGMT_FIB_MANAGER_HPP
#define NFD_MGMT_FIB_MANAGER_HPP

#include "common.hpp"
#include "face/face.hpp"
#include "mgmt/app-face.hpp"
#include "fw/strategy.hpp"
#include "mgmt/manager-base.hpp"

#include <ndn-cpp-dev/management/nfd-fib-management-options.hpp>

namespace nfd {

using ndn::nfd::FibManagementOptions;

class Forwarder;
class Fib;

class FibManager : public ManagerBase
{
public:

  FibManager(Fib& fib,
             function<shared_ptr<Face>(FaceId)> getFace,
             shared_ptr<AppFace> face);

  void
  onFibRequest(const Interest& request);

private:

  void
  insertEntry(const FibManagementOptions& options,
              ControlResponse& response);

  void
  deleteEntry(const FibManagementOptions& options,
              ControlResponse& response);

  void
  addNextHop(const FibManagementOptions& options,
             ControlResponse& response);

  void
  removeNextHop(const FibManagementOptions& options,
                ControlResponse& response);

  void
  strategy(const FibManagementOptions& options,
           ControlResponse& response);

  bool
  extractOptions(const Interest& request,
                 FibManagementOptions& extractedOptions);

  // void
  // onConfig(ConfigFile::Node section, bool isDryRun);

private:

  Fib& m_managedFib;
  function<shared_ptr<Face>(FaceId)> m_getFace;
  std::map<Name, shared_ptr<fw::Strategy> > m_namespaceToStrategyMap;

  typedef function<void(FibManager*,
                        const FibManagementOptions&,
                        ControlResponse&)> VerbProcessor;

  typedef std::map<Name::Component, VerbProcessor> VerbDispatchTable;

  typedef std::pair<Name::Component, VerbProcessor> VerbAndProcessor;


  const VerbDispatchTable m_verbDispatch;

  static const Name FIB_MANAGER_COMMAND_PREFIX; // /localhost/nfd/fib

  // number of components in an invalid, but not malformed, unsigned command.
  // (/localhost/nfd/fib + verb + options) = 5
  static const size_t FIB_MANAGER_COMMAND_UNSIGNED_NCOMPS;

  // number of components in a valid signed Interest.
  // 5 in mock (see UNSIGNED_NCOMPS), 8 with signed Interest support.
  static const size_t FIB_MANAGER_COMMAND_SIGNED_NCOMPS;

  static const VerbAndProcessor FIB_MANAGER_COMMAND_VERBS[];

};

} // namespace nfd

#endif // NFD_MGMT_FIB_MANAGER_HPP
