#include "on_change_threshold.hpp"

#include <phosphor-logging/log.hpp>

OnChangeThreshold::OnChangeThreshold(
    const std::string& triggerIdIn, Sensors sensorsIn,
    std::vector<std::unique_ptr<interfaces::TriggerAction>> actionsIn,
    std::unique_ptr<interfaces::Clock> clockIn) :
    triggerId(triggerIdIn),
    sensors(std::move(sensorsIn)), actions(std::move(actionsIn)),
    clock(std::move(clockIn))
{}

void OnChangeThreshold::initialize()
{
    for (auto& sensor : sensors)
    {
        sensor->registerForUpdates(weak_from_this());
    }
    initialized = true;
}

void OnChangeThreshold::updateSensors(Sensors newSensors)
{
    Sensors oldSensors = sensors;

    for (const auto& sensor : newSensors)
    {
        auto it =
            std::find_if(oldSensors.begin(), oldSensors.end(),
                         [&sensor](const auto& s) { return sensor == s; });
        if (it != oldSensors.end())
        {
            oldSensors.erase(it);
            continue;
        }

        if (initialized)
        {
            sensor->registerForUpdates(weak_from_this());
        }
    }

    if (initialized)
    {
        for (auto& sensor : oldSensors)
        {
            sensor->unregisterFromUpdates(weak_from_this());
        }
    }

    sensors = std::move(newSensors);
}

void OnChangeThreshold::sensorUpdated(interfaces::Sensor& sensor,
                                      Milliseconds timestamp, double value)
{
    if (isFirstReading)
    {
        isFirstReading = false;
        return;
    }

    commit(sensor.getName(), value);
}

void OnChangeThreshold::commit(const std::string& sensorName, double value)
{
    Milliseconds timestamp = clock->systemTimestamp();
    for (const auto& action : actions)
    {
        action->commit(triggerId, std::nullopt, sensorName, timestamp, value);
    }
}

LabeledThresholdParam OnChangeThreshold::getThresholdParam() const
{
    return {};
}
