#pragma once

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>

#include "sensors/sensor.hpp"


/*
 * The SensorManager holds all sensors across all zones.
 */
class SensorManager
{
    public:
        SensorManager(sdbusplus::bus::bus&& pass, sdbusplus::bus::bus&& host)
            : _passiveListeningBus(std::move(pass)),
              _hostSensorBus(std::move(host))
        {
            // manager gets its interface from the bus. :D
            sdbusplus::server::manager::manager(_hostSensorBus, SensorRoot);
        }

        SensorManager()
            : SensorManager(std::move(sdbusplus::bus::new_default()),
                            std::move(sdbusplus::bus::new_default()))
        {
        }

        ~SensorManager() = default;
        SensorManager(const SensorManager&) = delete;
        SensorManager& operator=(const SensorManager&) = delete;
        SensorManager(SensorManager&&) = default;
        SensorManager& operator=(SensorManager&&) = default;

        /*
         * Add a Sensor to the Manager.
         */
        void addSensor(
            std::string type,
            std::string name,
            std::unique_ptr<Sensor> sensor);

        // TODO(venture): Should implement read/write by name.
        Sensor* getSensor(const std::string& name) const
        {
            return _sensorMap.at(name).get();
        }

        sdbusplus::bus::bus& getPassiveBus(void)
        {
            return _passiveListeningBus;
        }

        sdbusplus::bus::bus& getHostBus(void)
        {
            return _hostSensorBus;
        }

    private:
        std::map<std::string, std::unique_ptr<Sensor>> _sensorMap;
        std::map<std::string, std::vector<std::string>> _sensorTypeList;

        sdbusplus::bus::bus _passiveListeningBus;
        sdbusplus::bus::bus _hostSensorBus;

        static constexpr auto SensorRoot = "/xyz/openbmc_project/extsensors";
};

