#include "elog_entry.hpp"

#include "elog_serialize.hpp"
#include "log_manager.hpp"

#include <unistd.h>

#include <xyz/openbmc_project/Common/File/error.hpp>

namespace phosphor
{
namespace logging
{

// TODO Add interfaces to handle the error log id numbering

void Entry::delete_()
{
    parent.erase(id());
}

bool Entry::resolved(bool value)
{
    auto current =
        sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved();
    if (value != current)
    {
        value ? associations({}) : associations(assocs);
        current =
            sdbusplus::xyz::openbmc_project::Logging::server::Entry::resolved(
                value);

        uint64_t ms = std::chrono::duration_cast<std::chrono::milliseconds>(
                          std::chrono::system_clock::now().time_since_epoch())
                          .count();
        updateTimestamp(ms);

        serialize(*this);
    }

    return current;
}

sdbusplus::message::unix_fd Entry::getEntry()
{
    FILE* fp = fopen(path().c_str(), "rb");
    if (fp == nullptr)
    {
        auto e = errno;
        log<level::ERR>("Failed to open Entry File", entry("ERRNO=%d", e),
                        entry("PATH=%s", path().c_str()));
        throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open();
    }

    auto fd = fileno(fp);

    // Schedule the fd to be closed by sdbusplus when it sends it back over
    // D-Bus.
    sdeventplus::Event event = sdeventplus::Event::get_default();
    fdCloseEventSource = std::make_unique<sdeventplus::source::Defer>(
        event, std::bind(std::mem_fn(&Entry::closeFD), this, fd,
                         std::placeholders::_1));

    return fd;
}

void Entry::closeFD(int fd, sdeventplus::source::EventBase& source)
{
    close(fd);
    fdCloseEventSource.reset();
}

} // namespace logging
} // namespace phosphor
