#include "hyp_sys_config.hpp"

#include "hyp_network_manager.hpp"

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

namespace phosphor
{
namespace network
{

constexpr auto BIOS_SERVICE = "xyz.openbmc_project.BIOSConfigManager";
constexpr auto BIOS_OBJPATH = "/xyz/openbmc_project/bios_config/manager";
constexpr auto BIOS_MGR_INTF = "xyz.openbmc_project.BIOSConfig.Manager";

using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using InvalidArgumentMetadata = xyz::openbmc_project::Common::InvalidArgument;

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

void HypSysConfig::setHostName()
{
    auto name = getHostNameFromBios();

    SysConfigIntf::hostName(std::move(name));
}

std::string HypSysConfig::hostName(std::string name)
{
    if (SysConfigIntf::hostName() == name)
    {
        return name;
    }

    name = SysConfigIntf::hostName(name);
    setHostNameInBios(name);
    return name;
}

std::string HypSysConfig::getHostNameFromBios() const
{
    try
    {
        using getAttrRetType =
            std::tuple<std::string, std::variant<std::string, int64_t>,
                       std::variant<std::string, int64_t>>;
        getAttrRetType name;
        auto method = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
                                          BIOS_MGR_INTF, "GetAttribute");

        method.append("vmi_hostname");

        auto reply = bus.call(method);

        std::string type;
        std::variant<std::string, int64_t> currValue;
        std::variant<std::string, int64_t> defValue;
        reply.read(type, currValue, defValue);
        return std::get<std::string>(currValue);
    }
    catch (const sdbusplus::exception::SdBusError& ex)
    {
        log<level::ERR>("Failed to get the hostname from bios table",
                        entry("ERR=%s", ex.what()));
    }
    return std::string();
}

void HypSysConfig::setHostNameInBios(const std::string& name)
{
    auto properties = bus.new_method_call(BIOS_SERVICE, BIOS_OBJPATH,
                                          BIOS_MGR_INTF, "SetAttribute");
    properties.append("vmi_hostname");
    properties.append(std::variant<std::string>(name));
    auto result = bus.call(properties);

    if (result.is_method_error())
    {
        throw std::runtime_error("Set attribute api failed");
    }
}

} // namespace network
} // namespace phosphor
