#include "system_configuration.hpp"

#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
#include <xyz/openbmc_project/Common/error.hpp>

namespace phosphor
{
namespace network
{

static constexpr char HOSTNAMED_SVC[] = "org.freedesktop.hostname1";
static constexpr char HOSTNAMED_OBJ[] = "/org/freedesktop/hostname1";
static constexpr char HOSTNAMED_INTF[] = "org.freedesktop.hostname1";

using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;

static constexpr char propMatch[] =
    "type='signal',sender='org.freedesktop.hostname1',"
    "path='/org/freedesktop/hostname1',"
    "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',"
    "arg0='org.freedesktop.hostname1'";

SystemConfiguration::SystemConfiguration(sdbusplus::bus_t& bus,
                                         stdplus::const_zstring objPath) :
    Iface(bus, objPath.c_str(), Iface::action::defer_emit),
    bus(bus), hostnamePropMatch(bus, propMatch, [&](sdbusplus::message_t& m) {
        std::string intf;
        std::unordered_map<std::string, std::variant<std::string>> values;
        try
        {
            m.read(intf, values);
            auto it = values.find("Hostname");
            if (it == values.end())
            {
                return;
            }
            Iface::hostName(std::get<std::string>(it->second));
        }
        catch (const std::exception& e)
        {
            log<level::ERR>(
                fmt::format("Hostname match parsing failed: {}", e.what())
                    .c_str(),
                entry("ERROR=%s", e.what()));
        }
    })
{
    try
    {
        std::variant<std::string> name;
        auto req =
            bus.new_method_call(HOSTNAMED_SVC, HOSTNAMED_OBJ,
                                "org.freedesktop.DBus.Properties", "Get");

        req.append(HOSTNAMED_INTF, "Hostname");
        auto reply = bus.call(req);
        reply.read(name);
        SystemConfigIntf::hostName(std::get<std::string>(name), true);
    }
    catch (const std::exception& e)
    {
        auto msg = fmt::format("Failed to get hostname: {}", e.what());
        log<level::ERR>(msg.c_str(), entry("ERROR=%s", e.what()));
    }

    emit_object_added();
}

std::string SystemConfiguration::hostName(std::string name)
{
    if (SystemConfigIntf::hostName() == name)
    {
        return name;
    }
    try
    {
        auto method = bus.new_method_call(HOSTNAMED_SVC, HOSTNAMED_OBJ,
                                          HOSTNAMED_INTF, "SetStaticHostname");
        method.append(name, /*interactive=*/false);
        bus.call_noreply(method);
        return SystemConfigIntf::hostName(std::move(name));
    }
    catch (const std::exception& e)
    {
        auto msg = fmt::format("Failed to set hostname: {}", e.what());
        log<level::ERR>(msg.c_str(), entry("ERROR=%s", e.what()));
    }
    return SystemConfigIntf::hostName();
}

} // namespace network
} // namespace phosphor
