#pragma once
#include "types.hpp"

#include <sdbusplus/bus.hpp>
#include <sdbusplus/message/native_types.hpp>
#include <sdbusplus/server/object.hpp>
#include <stdplus/pinned.hpp>
#include <xyz/openbmc_project/Network/Neighbor/server.hpp>
#include <xyz/openbmc_project/Object/Delete/server.hpp>

#include <string_view>

namespace phosphor
{
namespace network
{

using NeighborIntf = sdbusplus::xyz::openbmc_project::Network::server::Neighbor;

using NeighborObj = sdbusplus::server::object_t<
    NeighborIntf, sdbusplus::xyz::openbmc_project::Object::server::Delete>;

class EthernetInterface;

/** @class Neighbor
 *  @brief OpenBMC network neighbor implementation.
 *  @details A concrete implementation for the
 *  xyz.openbmc_project.Network.Neighbor dbus interface.
 */
class Neighbor : public NeighborObj
{
  public:
    /** @brief Constructor to put object onto bus at a dbus path.
     *  @param[in] bus - Bus to attach to.
     *  @param[in] objRoot - Path to attach at.
     *  @param[in] parent - Parent object.
     *  @param[in] addr - IP address.
     *  @param[in] lladdr - Low level MAC address.
     *  @param[in] state - The state of the neighbor entry.
     */
    Neighbor(sdbusplus::bus_t& bus, std::string_view objRoot,
             stdplus::PinnedRef<EthernetInterface> parent,
             stdplus::InAnyAddr addr, stdplus::EtherAddr lladdr, State state);

    /** @brief Delete this d-bus object.
     */
    void delete_() override;

    using NeighborObj::ipAddress;
    std::string ipAddress(std::string) override;
    using NeighborObj::macAddress;
    std::string macAddress(std::string) override;
    using NeighborObj::state;
    State state(State) override;

    inline const auto& getObjPath() const
    {
        return objPath;
    }

  private:
    /** @brief Parent Object. */
    stdplus::PinnedRef<EthernetInterface> parent;

    /** @brief Dbus object path */
    sdbusplus::message::object_path objPath;

    Neighbor(sdbusplus::bus_t& bus, sdbusplus::message::object_path objPath,
             stdplus::PinnedRef<EthernetInterface> parent,
             stdplus::InAnyAddr addr, stdplus::EtherAddr lladdr, State state);
};

} // namespace network
} // namespace phosphor
