#pragma once

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server/object.hpp>
#include <sdeventplus/clock.hpp>
#include <sdeventplus/event.hpp>
#include <sdeventplus/utility/timer.hpp>
#include <xyz/openbmc_project/Memory/MemoryECC/server.hpp>

namespace phosphor
{
namespace memory
{

template <typename... T>
using ServerObject = typename sdbusplus::server::object_t<T...>;

using EccInterface = sdbusplus::xyz::openbmc_project::Memory::server::MemoryECC;
using EccObject = ServerObject<EccInterface>;
/** @class
 *  @brief Manages ECC
 */
class ECC :
    sdbusplus::server::object_t<
        sdbusplus::xyz::openbmc_project::Memory::server::MemoryECC>
{
  public:
    ECC() = delete;
    ~ECC() = default;
    ECC(const ECC&) = delete;
    ECC& operator=(const ECC&) = delete;
    ECC(ECC&&) = default;
    ECC& operator=(ECC&&) = default;

    /** @brief Constructs
     *
     * @param[in] bus     - Handle to system dbus
     * @param[in] objPath - The Dbus path
     */
    ECC(sdbusplus::bus_t& bus, const std::string& objPath) :
        sdbusplus::server::object_t<
            sdbusplus::xyz::openbmc_project::Memory::server::MemoryECC>(
            bus, objPath.c_str()),
        _bus(bus), _event(sdeventplus::Event::get_default()),
        _timer(_event, std::bind(&ECC::read, this)){
            // Nothing to do here
        };

    int64_t previousCeCounter = 0;
    int64_t previousUeCounter = 0;
    int64_t maxECCLog = 0;

    void run();
    void controlEDACReport(std::string);

  private:
    /** @brief sdbusplus bus client connection. */
    sdbusplus::bus_t& _bus;
    /** @brief the Event Loop structure */
    sdeventplus::Event _event;
    /** @brief Read Timer */
    sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> _timer;
    /** @brief Read sysfs entries */
    void read();

    /** @brief Set up D-Bus object init */
    void init();

    std::string getValue(std::string);

    void writeValue(std::string, std::string);
    // set ce_count to dbus
    int checkCeCount();
    // set ue_count to dbus
    int checkUeCount();
    // set eccErrorCount to dbus
    void checkEccLogFull(int64_t, int64_t);

    void resetCounter();
    // set maxECCLog value
    void getMaxLogValue();

    void addSELLog(std::string, std::string, std::vector<uint8_t>, bool,
                   uint16_t);
};

} // namespace memory
} // namespace phosphor
