#pragma once

#include "health_metric_config.hpp"
#include "health_utils.hpp"

#include <xyz/openbmc_project/Association/Definitions/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/Bmc/server.hpp>
#include <xyz/openbmc_project/Metric/Value/server.hpp>

#include <deque>
#include <tuple>

namespace phosphor::health::metric
{

using phosphor::health::utils::paths_t;
using phosphor::health::utils::startUnit;
using AssociationIntf =
    sdbusplus::xyz::openbmc_project::Association::server::Definitions;
using ValueIntf = sdbusplus::xyz::openbmc_project::Metric::server::Value;
using PathIntf =
    sdbusplus::common::xyz::openbmc_project::metric::Value::namespace_path;
static constexpr auto BmcPath =
    sdbusplus::common::xyz::openbmc_project::metric::Value::bmc;
using BmcIntf = sdbusplus::xyz::openbmc_project::Inventory::Item::server::Bmc;
using MetricIntf =
    sdbusplus::server::object_t<ValueIntf, ThresholdIntf, AssociationIntf>;

struct MValue
{
    /** @brief Value for end user consumption */
    double user;
    /** @brief Value for threshold monitor */
    double monitor;
};

class HealthMetric : public MetricIntf
{
  public:
    HealthMetric() = delete;
    HealthMetric(const HealthMetric&) = delete;
    HealthMetric(HealthMetric&&) = delete;
    virtual ~HealthMetric() = default;

    HealthMetric(sdbusplus::bus_t& bus, phosphor::health::metric::Type type,
                 const config::HealthMetric& config, const paths_t& bmcPaths) :
        MetricIntf(bus, getPath(config.subType).c_str(), action::defer_emit),
        bus(bus), type(type), config(config)
    {
        create(bmcPaths);
        this->emit_object_added();
    }

    /** @brief Update the health metric with the given value */
    void update(MValue value);

  private:
    /** @brief Create a new health metric object */
    void create(const paths_t& bmcPaths);
    /** @brief Init properties for the health metric object */
    void initProperties();
    /** @brief Check specified threshold for the given value */
    void checkThreshold(ThresholdIntf::Type type, ThresholdIntf::Bound bound,
                        double value);
    /** @brief Check all thresholds for the given value */
    void checkThresholds(double value);
    /** @brief Get the object path for the given subtype */
    auto getPath(SubType subType) -> std::string;
    /** @brief D-Bus bus connection */
    sdbusplus::bus_t& bus;
    /** @brief Metric type */
    phosphor::health::metric::Type type;
    /** @brief Metric configuration */
    const config::HealthMetric config;
    /** @brief Window for metric history */
    std::deque<double> history;
};

} // namespace phosphor::health::metric
