#pragma once

#include "persistent_json_storage.hpp"
#include "report_factory.hpp"
#include "report_manager.hpp"
#include "sensor_cache.hpp"
#include "trigger_factory.hpp"
#include "trigger_manager.hpp"

#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>

#include <memory>

class Telemetry
{
  public:
    explicit Telemetry(std::shared_ptr<sdbusplus::asio::connection> bus) :
        objServer(std::make_shared<sdbusplus::asio::object_server>(bus)),
        reportManager(
            std::make_unique<ReportFactory>(bus, objServer, sensorCache),
            std::make_unique<PersistentJsonStorage>(
                interfaces::JsonStorage::DirectoryPath(
                    "/var/lib/telemetry/Reports")),
            objServer),
        triggerManager(
            std::make_unique<TriggerFactory>(bus, objServer, sensorCache),
            std::make_unique<PersistentJsonStorage>(
                interfaces::JsonStorage::DirectoryPath(
                    "/var/lib/telemetry/Triggers")),
            objServer)
    {}

  private:
    std::shared_ptr<sdbusplus::asio::object_server> objServer;
    mutable SensorCache sensorCache;
    ReportManager reportManager;
    TriggerManager triggerManager;
};