#pragma once

#include "interfaces/report_manager.hpp"
#include "interfaces/sensor.hpp"
#include "interfaces/trigger_factory.hpp"
#include "sensor_cache.hpp"

#include <sdbusplus/asio/object_server.hpp>

class TriggerFactory : public interfaces::TriggerFactory
{
  public:
    TriggerFactory(std::shared_ptr<sdbusplus::asio::connection> bus,
                   std::shared_ptr<sdbusplus::asio::object_server> objServer,
                   SensorCache& sensorCache,
                   interfaces::ReportManager& reportManager);

    std::unique_ptr<interfaces::Trigger> make(
        boost::asio::yield_context& yield, const std::string& name,
        bool isDiscrete, bool logToJournal, bool logToRedfish,
        bool updateReport,
        const std::vector<
            std::pair<sdbusplus::message::object_path, std::string>>& sensors,
        const std::vector<std::string>& reportNames,
        const TriggerThresholdParams& thresholdParams,
        interfaces::TriggerManager& triggerManager,
        interfaces::JsonStorage& triggerStorage) const override;

  private:
    std::shared_ptr<sdbusplus::asio::connection> bus;
    std::shared_ptr<sdbusplus::asio::object_server> objServer;
    SensorCache& sensorCache;
    interfaces::ReportManager& reportManager;

    std::pair<std::vector<std::shared_ptr<interfaces::Sensor>>,
              std::vector<std::string>>
        getSensors(boost::asio::yield_context& yield,
                   const std::vector<
                       std::pair<sdbusplus::message::object_path, std::string>>&
                       sensorPaths) const;
};