#include "file_io_type_progress_src.hpp"

#include "common/utils.hpp"

#include <phosphor-logging/lg2.hpp>

PHOSPHOR_LOG2_USING;

namespace pldm
{

namespace responder
{

int ProgressCodeHandler::setRawBootProperty(
    const std::tuple<uint64_t, std::vector<uint8_t>>& progressCodeBuffer)
{
    static constexpr auto RawObjectPath =
        "/xyz/openbmc_project/state/boot/raw0";
    static constexpr auto RawInterface = "xyz.openbmc_project.State.Boot.Raw";
    static constexpr auto FreedesktopInterface =
        "org.freedesktop.DBus.Properties";
    static constexpr auto RawProperty = "Value";
    static constexpr auto SetMethod = "Set";

    auto& bus = pldm::utils::DBusHandler::getBus();

    try
    {
        auto service = pldm::utils::DBusHandler().getService(RawObjectPath,
                                                             RawInterface);
        auto method = bus.new_method_call(service.c_str(), RawObjectPath,
                                          FreedesktopInterface, SetMethod);
        method.append(RawInterface, RawProperty,
                      std::variant<std::tuple<uint64_t, std::vector<uint8_t>>>(
                          progressCodeBuffer));

        bus.call_noreply(method);
    }
    catch (const std::exception& e)
    {
        error(
            "failed to make a d-bus call to host-postd daemon, ERROR={ERR_EXCEP}",
            "ERR_EXCEP", e.what());
        return PLDM_ERROR;
    }

    return PLDM_SUCCESS;
}

int ProgressCodeHandler::write(const char* buffer, uint32_t /*offset*/,
                               uint32_t& length,
                               oem_platform::Handler* /*oemPlatformHandler*/)
{
    static constexpr auto StartOffset = 40;
    static constexpr auto EndOffset = 48;
    if (buffer != nullptr)
    {
        // read the data from the pointed location
        std::vector<uint8_t> secondaryCode(buffer, buffer + length);

        // Get the primary code from the offset 40 bytes in the received buffer

        std::vector<uint8_t> primaryCodeArray(
            secondaryCode.begin() + StartOffset,
            secondaryCode.begin() + EndOffset);
        uint64_t primaryCode = 0;

        // form a uint64_t using uint8_t[8]
        for (int i = 0; i < 8; i++)
            primaryCode |= (uint64_t)primaryCodeArray[i] << 8 * i;

        return setRawBootProperty(std::make_tuple(primaryCode, secondaryCode));
    }
    return PLDM_ERROR;
}

} // namespace responder
} // namespace pldm
