#pragma once

#include "xyz/openbmc_project/Network/SystemConfiguration/server.hpp"

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>

#include <string>

namespace phosphor
{
namespace network
{

using SystemConfigIntf =
    sdbusplus::xyz::openbmc_project::Network::server::SystemConfiguration;

using Iface =
    sdbusplus::server::object::object<SystemConfigIntf>;

class Manager; // forward declaration of network manager.

/** @class SystemConfiguration
 *  @brief Network system configuration.
 *  @details A concrete implementation for the
 *  xyz.openbmc_project.Network.SystemConfiguration DBus API.
 */
class SystemConfiguration : public Iface
{
    public:
        SystemConfiguration() = default;
        SystemConfiguration(const SystemConfiguration&) = delete;
        SystemConfiguration& operator=(const SystemConfiguration&) = delete;
        SystemConfiguration(SystemConfiguration&&) = delete;
        SystemConfiguration& operator=(SystemConfiguration&&) = delete;
        virtual ~SystemConfiguration() = default;

        /** @brief Constructor to put object onto bus at a dbus path.
         *  @param[in] bus - Bus to attach to.
         *  @param[in] objPath - Path to attach at.
         *  @param[in] parent - Parent object.
         */
        SystemConfiguration(sdbusplus::bus::bus& bus,
                            const std::string& objPath,
                            Manager& parent);

        /** @brief set the hostname of the system.
         *  @param[in] name - host name of the system.
         */
        std::string hostName(std::string name) override;

        /** @brief set the default gateway of the system.
         *  @param[in] gateway - default gateway of the system.
         */
        std::string defaultGateway(std::string gateway) override;

        using SystemConfigIntf::defaultGateway;

    private:

        /** @brief get the hostname from the system by doing
         *         dbus call to hostnamed service.
         */
        std::string getHostNameFromSystem() const;

        /** @brief Persistent sdbusplus DBus bus connection. */
        sdbusplus::bus::bus& bus;

        /** @brief Network Manager object. */
        Manager& manager;

};

} // namespace network
} // namespace phosphor
