#pragma once

#include "interfaces/trigger_types.hpp"

#include <sdbusplus/message.hpp>

#include <chrono>
#include <utility>

class TriggerParams
{
  public:
    TriggerParams& name(std::string val)
    {
        nameProperty = std::move(val);
        return *this;
    }

    const std::string& name() const
    {
        return nameProperty;
    }

    TriggerParams& isDiscrete(bool val)
    {
        discreteProperty = val;
        return *this;
    }

    bool isDiscrete() const
    {
        return discreteProperty;
    }

    bool logToJournal() const
    {
        return logToJournalProperty;
    }

    bool logToRedfish() const
    {
        return logToRedfishProperty;
    }

    TriggerParams& updateReport(bool updateReport)
    {
        updateReportProperty = updateReport;
        return *this;
    }

    bool updateReport() const
    {
        return updateReportProperty;
    }

    const TriggerSensors& sensors() const
    {
        return sensorsProperty;
    }

    const std::vector<std::string>& reportNames() const
    {
        return reportNamesProperty;
    }

    TriggerParams& thresholdParams(TriggerThresholdParams val)
    {
        thresholdsProperty = std::move(val);
        return *this;
    }

    const TriggerThresholdParams& thresholdParams() const
    {
        return thresholdsProperty;
    }

  private:
    std::string nameProperty = "Trigger1";
    bool discreteProperty = false;
    bool logToJournalProperty = false;
    bool logToRedfishProperty = false;
    bool updateReportProperty = true;
    TriggerSensors sensorsProperty = {
        {sdbusplus::message::object_path(
             "/xyz/openbmc_project/sensors/temperature/BMC_Temp"),
         ""}};
    std::vector<std::string> reportNamesProperty = {"Report1"};
    TriggerThresholdParams thresholdsProperty =
        std::vector<numeric::ThresholdParam>{
            {numeric::typeToString(numeric::Type::lowerCritical),
             std::chrono::milliseconds(10).count(),
             numeric::directionToString(numeric::Direction::decreasing), 0.0},
            {numeric::typeToString(numeric::Type::upperCritical),
             std::chrono::milliseconds(10).count(),
             numeric::directionToString(numeric::Direction::increasing), 90.0}};
};
