// SPDX-License-Identifier: Apache-2.0

#include "pldm_utils.hpp"

#include "dump_utils.hpp"
#include "xyz/openbmc_project/Common/error.hpp"

#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/lg2.hpp>

namespace phosphor
{
namespace dump
{
namespace pldm
{

using namespace phosphor::logging;
using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;

int openPLDM()
{
    auto fd = pldm_open();
    if (fd < 0)
    {
        auto e = errno;
        lg2::error(
            "pldm_open failed, errno: {ERRNO}, FD: FD", "ERRNO", e, "FD",
            static_cast<std::underlying_type<pldm_requester_error_codes>::type>(
                fd));
        elog<NotAllowed>(
            Reason("Required host dump action via pldm is not allowed due "
                   "to pldm_open failed"));
    }
    return fd;
}

uint8_t getPLDMInstanceID(uint8_t eid)
{
    constexpr auto pldmRequester = "xyz.openbmc_project.PLDM.Requester";
    constexpr auto pldm = "/xyz/openbmc_project/pldm";
    uint8_t instanceID = 0;

    try
    {
        auto bus = sdbusplus::bus::new_default();
        auto service = phosphor::dump::getService(bus, pldm, pldmRequester);

        auto method = bus.new_method_call(service.c_str(), pldm, pldmRequester,
                                          "GetInstanceId");
        method.append(eid);
        auto reply = bus.call(method);

        reply.read(instanceID);

        lg2::info("Got instanceId: {INSTANCE_ID} from PLDM eid: {EID}",
                  "INSTANCE_ID", instanceID, "EID", eid);
    }
    catch (const sdbusplus::exception::SdBusError& e)
    {
        lg2::error("Failed to get instance id error: {ERROR}", "ERROR", e);
        elog<NotAllowed>(Reason("Failure in communicating with pldm service, "
                                "service may not be running"));
    }
    return instanceID;
}

} // namespace pldm
} // namespace dump
} // namespace phosphor
