#pragma once

#include <sdbusplus/bus.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
#include <xyz/openbmc_project/Sensor/Value/server.hpp>

namespace phosphor
{
namespace nvme
{

using ValueIface = sdbusplus::xyz::openbmc_project::Sensor::server::Value;

using CriticalInterface =
    sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Critical;

using WarningInterface =
    sdbusplus::xyz::openbmc_project::Sensor::Threshold::server::Warning;

using NvmeIfaces =
    sdbusplus::server::object::object<ValueIface, CriticalInterface,
                                      WarningInterface>;

class NvmeSSD : public NvmeIfaces
{
  public:
    NvmeSSD() = delete;
    NvmeSSD(const NvmeSSD&) = delete;
    NvmeSSD& operator=(const NvmeSSD&) = delete;
    NvmeSSD(NvmeSSD&&) = delete;
    NvmeSSD& operator=(NvmeSSD&&) = delete;
    virtual ~NvmeSSD() = default;

    /** @brief Constructs NvmeSSD
     *
     * @param[in] bus     - Handle to system dbus
     * @param[in] objPath - The Dbus path of nvme
     */
    NvmeSSD(sdbusplus::bus::bus& bus, const char* objPath) :
        NvmeIfaces(bus, objPath), bus(bus)
    {
    }

    /** @brief Set sensor value temperature to nvme D-bus  */
    void setSensorValueToDbus(const int8_t value);
    /** @brief Check if sensor value higher or lower threshold */
    void checkSensorThreshold();
    /** @brief Set Sensor Threshold to D-bus at beginning */
    void setSensorThreshold(int8_t criticalHigh, int8_t criticalLow,
                            int8_t warningHigh, int8_t warningLow);
    /** @brief Set Sensor Max/Min value to D-bus at beginning */
    void setSensorMaxMin(int8_t maxValue, int8_t minValue);

  private:
    sdbusplus::bus::bus& bus;
};
} // namespace nvme
} // namespace phosphor
