/*
 * SPDX-FileCopyrightText: Copyright OpenBMC Authors
 * SPDX-License-Identifier: Apache-2.0
 */

#include "NvidiaGpuResetRequired.hpp"

#include "NvidiaEventReporting.hpp"

#include <boost/system/error_code.hpp>
#include <phosphor-logging/lg2.hpp>
#include <sdbusplus/asio/connection.hpp>

#include <cstdint>
#include <format>
#include <map>
#include <memory>
#include <span>
#include <string>

NvidiaResetRequiredEventHandler::NvidiaResetRequiredEventHandler(
    const std::string& deviceName,
    const std::shared_ptr<sdbusplus::asio::connection>& conn) :
    deviceName(deviceName), conn(conn)
{}

void NvidiaResetRequiredEventHandler::handleLoggingComplete(
    const boost::system::error_code& ec)
{
    if (ec)
    {
        lg2::error("Failed to log ResetRequired event for device {DEV}: {EC}",
                   "DEV", deviceName, "EC", ec.message());
    }
}

void NvidiaResetRequiredEventHandler::handleResetRequiredEvent(
    const EventInfo& /*unused*/, std::span<const uint8_t> /*unused*/)
{
    const std::string eventMessage =
        std::format("The resource {} requires a reset. Reset the GPU or power "
                    "cycle the baseboard.",
                    deviceName);

    conn->async_method_call(
        [weak{weak_from_this()}](const boost::system::error_code& ec) {
            std::shared_ptr<NvidiaResetRequiredEventHandler> self = weak.lock();
            if (!self)
            {
                lg2::error(
                    "Invalid reference to NvidiaResetRequiredEventHandler");
                return;
            }
            self->handleLoggingComplete(ec);
        },
        "xyz.openbmc_project.Logging", "/xyz/openbmc_project/logging",
        "xyz.openbmc_project.Logging.Create", "Create", eventMessage,
        "xyz.openbmc_project.Logging.Entry.Level.Critical",
        std::map<std::string, std::string>{});
}
