#pragma once
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

#include <function2/function2.hpp>
#include <stdplus/raw.hpp>
#include <string_view>
#include <tuple>
#include <type_traits>

namespace phosphor
{
namespace network
{
namespace netlink
{

/* @brief Called on each nlmsg received on the socket
 */
using ReceiveCallback =
    fu2::function_view<void(const nlmsghdr&, std::string_view)>;

namespace detail
{

void processMsg(std::string_view& msgs, bool& done, ReceiveCallback cb);

void performRequest(int protocol, void* data, size_t size, ReceiveCallback cb);

} // namespace detail

/** @brief Receives all outstanding messages on a netlink socket
 *
 *  @param[in] sock - The socket to receive the messages on
 *  @param[in] cb   - Called for each response message payload
 */
size_t receive(int sock, ReceiveCallback cb);

/* @brief Call on an rtnetlink payload
 *        Updates the input to remove the attr parsed out.
 *
 * @param[in,out] data - The buffer holding rtpayload to parse
 * @return The payload for the rt msg
 */
template <typename T>
constexpr const T& extractRtData(std::string_view& data)
{
    const T& ret = stdplus::raw::refFrom<T, stdplus::raw::Aligned>(data);
    data.remove_prefix(NLMSG_ALIGN(sizeof(T)));
    return ret;
}

/* @brief Call on a block of rtattrs to parse a single one out
 *        Updates the input to remove the attr parsed out.
 *
 * @param[in,out] attrs - The buffer holding rtattrs to parse
 * @return A tuple of rtattr header + data buffer for the attr
 */
std::tuple<rtattr, std::string_view> extractRtAttr(std::string_view& data);

/** @brief Performs a netlink request of the specified type with the given
 *  message Calls the callback upon receiving
 *
 *  @param[in] protocol - The netlink protocol to use when opening the socket
 *  @param[in] type     - The netlink message type
 *  @param[in] flags    - Additional netlink flags for the request
 *  @param[in] msg      - The message payload for the request
 *  @param[in] cb       - Called for each response message payload
 */
template <typename T>
void performRequest(int protocol, uint16_t type, uint16_t flags, const T& msg,
                    ReceiveCallback cb)
{
    static_assert(std::is_trivially_copyable_v<T>);

    struct
    {
        nlmsghdr hdr;
        T msg;
    } data{};
    data.hdr.nlmsg_len = sizeof(data);
    data.hdr.nlmsg_type = type;
    data.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags;
    data.msg = msg;

    detail::performRequest(protocol, &data, sizeof(data), cb);
}

} // namespace netlink
} // namespace network
} // namespace phosphor
