#pragma once

#include <stdio.h>

#include <array>
#include <functional>
#include <list>
#include <map>
#include <memory>
#include <string>
#include <tuple>
#include <vector>

#include "slp_service_info.hpp"

namespace slp
{

using buffer = std::vector<uint8_t>;

template<typename T>
using deleted_unique_ptr = std::unique_ptr<T, std::function<void(T*)>>;

namespace request
{

/*
 * @struct ServiceType
 *
 * SLP Message structure for ServiceType Request.
 */
struct ServiceType
{
    std::string prList;
    std::string namingAuth;
    std::string scopeList;
};

/*
 * @struct Service
 *
 * SLP Message structure for Service Request.
 */
struct Service
{
    std::string prList;
    std::string srvType;
    std::string scopeList;
    std::string predicate;
    std::string spistr;
};
}//namespace request

/*
 * @enum FunctionType
 *
 * SLP Protocol supported Message types.
 */
enum class FunctionType : uint8_t
{
    SRVRQST     = 0x01,
    SRVRPLY     = 0x02,
    ATTRRQST    = 0x06,
    ATTRRPLY    = 0x07,
    SRVTYPERQST = 0x09,
    SRVTYPERPLY = 0x0A,
    SAADV       = 0x0B,
};

/*
 * @enum Error
 *
 * SLP Protocol defined Error Codes.
 */
enum class Error : uint8_t
{
    LANGUAGE_NOT_SUPPORTED = 0x01,
    PARSE_ERROR            = 0x02,
    INVALID_REGISTRATION   = 0x03,
    SCOPE_NOT_SUPPORTED    = 0x04,
    AUTHENTICATION_UNKNOWN = 0x05,
    AUTHENTICATION_ABSENT  = 0x06,
    AUTHENTICATION_FAILED  = 0x07,
    VER_NOT_SUPPORTED      = 0x09,
    INTERNAL_ERROR         = 0x0A,
    DA_BUSY_NOW            = 0x0B,
    OPTION_NOT_UNDERSTOOD  = 0x0C,
    INVALID_UPDATE         = 0x0D,
    MSG_NOT_SUPPORTED      = 0x0E,
};

/*
 * @struct Header
 *
 * SLP Protocol Header
 */
struct Header
{
    uint8_t version = 0;
    uint8_t functionID = 0;
    std::array<uint8_t, 3> length;
    uint16_t flags = 0;
    std::array<uint8_t, 3> extOffset;
    uint16_t xid = 0;
    uint16_t langtagLen = 0;
    std::string langtag;

};

/*
 * @struct Payload
 * This is a payload of the SLP Message currently
 * we are supporting two request.
 *
 */
struct Payload
{
    request::ServiceType srvtyperqst;
    request::Service srvrqst;
};


/*
 * @struct Messsage
 *
 * This will denote the slp Message.
 */
struct Message
{
    Header header;
    Payload body;
};


namespace parser
{

/** Parse a buffer and fill the header and the body of the message.
 *
 * @param[in] buffer - The buffer from which data should be parsed.
 *
 * @return Zero on success and parsed msg object,
 *         non-zero on failure and empty msg object.
 *
 */

std::tuple<int, Message> parseBuffer(const buffer& buf);

namespace internal
{

/** Parse header data from the buffer.
 *
 * @param[in] buffer - The buffer from which data should be parsed.
 *
 * @return Zero on success and fills header object inside message,
 *         non-zero on failure and empty msg object.
 *
 * @internal
 */

std::tuple<int, Message> parseHeader(const buffer& buf);

/** Parse a srvType request
 *
 * @param[in] buffer - The buffer from which data should be parsed.
 *
 * @return Zero on success,and fills the body object inside message.
 *         non-zero on failure and empty msg object.
 *
 * @internal
 */

int parseSrvTypeRqst(const buffer& buf, Message& req);

/** Parse a service request.
  *
  * @param[in] buffer - The buffer from which data should be parsed.
  *
  * @return Zero on success,and fills the body object inside message.
  *         non-zero on failure and empty msg object.
  *
  * @internal
  */

int parseSrvRqst(const buffer& buf, Message& req);

}//namespace internal
}//namespce parser


namespace handler
{

/** Handle the  request  message.
 *
 * @param[in] msg - The message to process.
 *
 * @return In case of success, the vector is populated with the data
 *         available on the socket and return code is 0.
 *         In case of error, nonzero code and vector is set to size 0.
 *
 */

std::tuple<int, buffer> processRequest(const Message& msg);

/** Handle the error
 *
 * @param[in] msg - Req message.
 * @param[in] err - Error code.
 *
 * @return the vector populated with the error data
 */

buffer processError(const Message& req,
                    const uint8_t err);
namespace internal
{

using ServiceList = std::map<std::string, slp::ConfigData>;
/** Handle the  SrvRequest message.
 *
 * @param[in] msg - The message to process
 *
 * @return In case of success, the vector is populated with the data
 *         available on the socket and return code is 0.
 *         In case of error, nonzero code and vector is set to size 0.
 *
 * @internal
 */

std::tuple<int, buffer> processSrvRequest(const Message& msg);


/** Handle the  SrvTypeRequest message.
 *
 * @param[in] msg - The message to process
 *
 * @return In case of success, the vector is populated with the data
 *         available on the socket and return code is 0.
 *         In case of error, nonzero code and vector is set to size 0.
 *
 * @internal
 *
 */

std::tuple<int, buffer> processSrvTypeRequest(const Message& msg);

/**  Read the SLPinfo from the configuration.
 *
 * @param[in] filename - Name of the conf file
 *
 * @return the list of the services
 *
 * @internal
 *
 */
ServiceList readSLPServiceInfo();

/**  Get all the interface address
 *
 * @return the list of the interface address.
 *
 * @internal
 *
 */

std::list<std::string> getIntfAddrs();

/** Fill the buffer with the header data from the request object
 *
 * @param[in] req - Header data will be copied from
 *
 * @return the vector is populated with the data
 *
 * @internal
 */
buffer prepareHeader(const Message& req);


}//namespace internal
}//namespce handler
}//namespce slp
