/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2011 University of California, Los Angeles
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
 */

#ifndef CCNX_CONTENT_STORE_H
#define	CCNX_CONTENT_STORE_H

#include "ns3/object.h"
#include "ns3/ptr.h"

#include <list>
#include <string>
#include <iostream>

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/tag.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/mem_fun.hpp>

#include "hash-helper.h"
#include "ccnx-content-object-header.h"
#include "ccnx-interest-header.h"
#include "name-components.h"

namespace  ns3
{
class Packet;

/**
 * \ingroup ccnx
 * \brief NDN content store entry
 *
 * Content store entry stores separately pseudo header and content of
 * ContentObject packet.  It is responsibility of the caller to
 * construct a fully formed CcnxPacket by calling Copy(), AddHeader(),
 * AddTail() on the packet received by GetPacket() method.
 *
 * GetFullyFormedCcnxPacket method provided as a convenience
 */
class CcnxContentStoreEntry
{
public:
  /**
   * \brief Construct content store entry
   *
   * \param header Parsed CcnxContentObject header
   * \param packet Original CCNx packet
   *
   * The constructor will make a copy of the supplied packet and calls
   * RemoveHeader and RemoveTail on the copy.
   */
  CcnxContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);

  /**
   * \brief Get prefix of the stored entry
   * \returns prefix of the stored entry
   */
  inline const CcnxNameComponents&
  GetName () const;

  /**
   * \brief Get CcnxContentObjectHeader of the stored entry
   * \returns CcnxContentObjectHeader of the stored entry
   */
  inline Ptr<const CcnxContentObjectHeader>
  GetHeader () const;

  /**
   * \brief Get content of the stored entry
   * \returns content of the stored entry
   */
  inline Ptr<const Packet>
  GetPacket () const;

  /**
   * \brief Convenience method to create a fully formed CCNx packet from stored header and content
   * \returns A read-write copy of the packet with CcnxContentObjectHeader and CcxnContentObjectTail
   */
  Ptr<Packet>
  GetFullyFormedCcnxPacket () const;

// Copy constructor is required by the container. Though, we're
// storing only two pointers, so shouldn't be a problem
// private:
//   CcnxContentStoreEntry (const CcnxContentStoreEntry &); ///< disabled copy constructor
//   CcnxContentStoreEntry& operator= (const CcnxContentStoreEntry&); ///< disabled copy operator
  
private:
  Ptr<CcnxContentObjectHeader> m_header; ///< \brief non-modifiable CcnxContentObjectHeader
  Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet

  static CcnxContentObjectTail m_tail; ///< \internal for optimization purposes
};

/**
 * \ingroup ccnx
 * \brief Private namespace for CCNx content store implementation
 */
namespace __ccnx_private_content_store
{
class hash {}; ///< tag for Boost.Multiindex container (hashed prefix)
class mru {}; ///< tag for Boost.Multiindex container (most recent used index)
#ifdef _DEBUG
class ordered {}; ///< tag for Boost.MultiIndex container (ordered by prefix)
#endif
};

/**
 * \ingroup ccnx
 * \brief Typedef for content store container implemented as a Boost.MultiIndex container
 *
 * - First index (tag<prefix>) is a unique hash index based on NDN prefix of the stored content.
 * - Second index (tag<mru>) is a sequential index used to maintain up to m_maxSize most recent used (MRU) entries in the content store
 * - Third index (tag<ordered>) is just a helper to provide stored prefixes in ordered way. Should be disabled in production build
 *
 * \see http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/ for more information on Boost.MultiIndex library
 */
struct CcnxContentStoreContainer
{
  typedef
  boost::multi_index::multi_index_container<
    CcnxContentStoreEntry,
    boost::multi_index::indexed_by<
      boost::multi_index::hashed_unique<
        boost::multi_index::tag<__ccnx_private_content_store::hash>,
        boost::multi_index::const_mem_fun<CcnxContentStoreEntry,
                                          const CcnxNameComponents&,
                                          &CcnxContentStoreEntry::GetName>,
        CcnxPrefixHash>,
      boost::multi_index::sequenced<boost::multi_index::tag<__ccnx_private_content_store::mru> >
#ifdef _DEBUG
      ,
      boost::multi_index::ordered_unique<
        boost::multi_index::tag<__ccnx_private_content_store::ordered>,
        boost::multi_index::const_mem_fun<CcnxContentStoreEntry,
                                          const CcnxNameComponents&,
                                          &CcnxContentStoreEntry::GetName>
          >
#endif
      >
    > type;
};

/**
 * \ingroup ccnx
 * \brief NDN content store entry
 */
class CcnxContentStore : public Object
{
public:
  /**
   * \brief Interface ID
   *
   * \return interface ID
   */
  static TypeId GetTypeId ();
  
  // typedef string_key_hash_t<CsEntry>::iterator CsIterator;
  // typedef string_key_hash_t<CsEntry>::iterator CsRangeIterator;

  /**
   * Default constructor
   */
  CcnxContentStore( );
  virtual ~CcnxContentStore( );
            
  /**
   * \brief Find corresponding CS entry for the given interest
   *
   * \param interest Interest for which matching content store entry
   * will be searched
   *
   * If an entry is found, it is promoted to the top of most recent
   * used entries index, \see m_contentStore
   */
  Ptr<Packet>
  Lookup (Ptr<const CcnxInterestHeader> interest);
            
  /**
   * \brief Add a new content to the content store.
   *
   * \param header Fully parsed CcnxContentObjectHeader
   * \param packet Fully formed CCNx packet to add to content store
   * (will be copied and stripped down of headers)
   *
   * If entry with the same prefix exists, the old entry will be
   * promoted to the top of the MRU hash
   */
  void
  Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);

  /**
   * \brief Set maximum size of content store
   *
   * \param size size in packets
   */
  inline void
  SetMaxSize (uint32_t maxSize);

  /**
   * \brief Get maximum size of content store
   *
   * \returns size in packets
   */
  inline uint32_t
  GetMaxSize () const;
  
  /**
   * \brief Print out content store entries
   *
   * Debug build provides dumping of content store entries in
   * lexicographical order of corresponding prefixes
   *
   * Release build dumps everything in MRU order
   */
  void Print () const;
            
protected:
  // /**
  //  * \brief Move the given CS entry to the head of the list
  //  *
  //  * \param entry Content Store entry
  //  */
  // void Promote( CsEntry &entry );

  /**
   * \todo Alex: DoDispose and NotifyNewAggregate are seem to be very
   * important, but I'm not yet sure what exactly they are supposed to
   * do
   */
  // virtual void DoDispose ();
  // virtual void NotifyNewAggregate ();

private:
  CcnxContentStore (const CcnxContentStore &o); ///< Disabled copy constructor
  CcnxContentStore& operator= (const CcnxContentStore &o); ///< Disabled copy operator
 
private:
  size_t m_maxSize; ///< \brief maximum number of entries in cache \internal
  // string_key_hash_t<CsEntry>  m_contentStore;     ///< \brief actual content store \internal

  /**
   * \brief Content store implemented as a Boost.MultiIndex container
   * \internal
   */
    CcnxContentStoreContainer::type m_contentStore;
};

inline std::ostream&
operator<< (std::ostream &os, const CcnxContentStore &cs)
{
  cs.Print ();
  return os;
}

const CcnxNameComponents&
CcnxContentStoreEntry::GetName () const
{
  return m_header->GetName ();
}

Ptr<const CcnxContentObjectHeader>
CcnxContentStoreEntry::GetHeader () const
{
  return m_header;
}

Ptr<const Packet>
CcnxContentStoreEntry::GetPacket () const
{
  return m_packet;
}


inline void
CcnxContentStore::SetMaxSize (uint32_t maxSize)
{
  m_maxSize = maxSize;
}

inline uint32_t
CcnxContentStore::GetMaxSize () const
{
  return m_maxSize;
}

} //namespace ns3

#endif // CCNX_CONTENT_STORE_H
