#include "include/dbus_utility.hpp"

#ifdef UNIT_TEST
#include "test/include/mock_dbus_utility.hpp"
#endif

void DbusUtility::sendSdBusSignal(
    const char* signalName,
    const std::shared_ptr<sdbusplus::asio::dbus_interface>& ifaceLog)
{
    try
    {
        sdbusplus::message::message msg = ifaceLog->new_signal(signalName);
        msg.signal_send();
    }
    catch (const sdbusplus::exception::exception& e)
    {
        lg2::error("Failed to send sdbus signal {SIGNAL}", "SIGNAL",
                   signalName);
    }
}

void DbusUtility::dbusAddStoredLog(const std::string& logFileName)
{
    std::cerr << "called\n";
    lg2::info("Initiating D-Bus connection");
    conn = std::make_shared<sdbusplus::asio::connection>(io);

    lg2::info("Requesting D-Bus name");
    conn->request_name(powerFaultService);

    lg2::info("Creating D-Bus object server");
    server = std::make_shared<sdbusplus::asio::object_server>(conn);

    std::filesystem::path logPath = std::filesystem::path(powerFaultPath) /
                                    logFileName;
    std::shared_ptr<sdbusplus::asio::dbus_interface> ifaceLog =
        server->add_interface(logPath.c_str(), powerFaultInterface);

    lg2::info("Registering D-Bus properties and signals");

    ifaceLog->register_property("Filename", logFileName);
    ifaceLog->register_signal<void>("PowerFaultLogCompleted");
    ifaceLog->register_signal<void>("PowerFaultLogCreated");
    ifaceLog->register_signal<void>("PowerFaultLogDeleted");

    lg2::info("Initializing D-Bus interface");
    ifaceLog->initialize();

    lg2::info("Sending D-Bus signal PowerFaultLogCompleted");
    sendSdBusSignal("PowerFaultLogCompleted", ifaceLog);

    lg2::info("Sending D-Bus signal PowerFaultLogCreated");
    sdbusplus::message::message msg =
        ifaceLog->new_signal("PowerFaultLogCreated");
    msg.signal_send();

    lg2::info("Running D-Bus event loop");
    io.run();
}

DbusUtil* getDbusUtil()
{
    static DbusUtil dbusUtil;
    return &dbusUtil;
}
