/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
 * Copyright (C) 2013 Regents of the University of California.
 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
 * See COPYING for copyright and distribution information.
 */

#ifndef NDN_KEY_LOCATOR_HPP
#define NDN_KEY_LOCATOR_HPP

#include "encoding/block.hpp"
#include "name.hpp"

namespace ndn {

class KeyLocator {
public:
  struct Error : public std::runtime_error { Error(const std::string &what) : std::runtime_error(what) {} };
  
  enum {
    KeyLocator_None = 4294967295,
    KeyLocator_Name = 0,
    
    KeyLocator_Unknown = 255
  };

  inline
  KeyLocator()
    : type_(KeyLocator_None)
  {
  }

  inline
  KeyLocator(const Name &name);

  inline const Block& 
  wireEncode() const;

  inline void 
  wireDecode(const Block &value);
  
  inline bool
  empty() const
  {
    return type_ == KeyLocator_None;
  }
  
  uint32_t 
  getType() const { return type_; }
      
  ////////////////////////////////////////////////////////
  // Helper methods for different types of key locators
  //
  // For now only Name type is actually supported
  
  inline const Name&
  getName() const;

  inline void
  setName(const Name &name);
  
private:
  uint32_t type_;
  Name name_;
  
  mutable Block wire_;
};

inline
KeyLocator::KeyLocator(const Name &name)
{
  setName(name);
}

inline const Block& 
KeyLocator::wireEncode() const
{
  if (wire_.hasWire())
    return wire_;

  // KeyLocator

  switch (type_) {
  case KeyLocator_None:
    wire_ = dataBlock(Tlv::KeyLocator, reinterpret_cast<const uint8_t*>(0), 0);
    break;
  case KeyLocator_Name:
    wire_ = Block(Tlv::KeyLocator);
    wire_.push_back(name_.wireEncode());
    wire_.encode();
    break;
  default:
    throw Error("Unsupported KeyLocator type");
  }
  
  return wire_;
}

inline void 
KeyLocator::wireDecode(const Block &value)
{
  wire_ = value;
  wire_.parse();
  
  if (!wire_.getAll().empty() && wire_.getAll().front().type() == Tlv::Name)
    {
      type_ = KeyLocator_Name;
      name_.wireDecode(wire_.getAll().front());
    }
  else
    {
      type_ = KeyLocator_Unknown;
    }
}

inline const Name&
KeyLocator::getName() const
{
  if (type_ != KeyLocator_Name)
    throw Error("Requested Name, but KeyLocator is not of the Name type");

  return name_;
}

inline void
KeyLocator::setName(const Name &name)
{
  type_ = KeyLocator_Name;
  name_ = name;
}


} // namespace ndn

#endif
