#pragma once

#include "conf.hpp"
#include "controller.hpp"
#include "sensors/manager.hpp"
#include "sensors/sensor.hpp"
#include "xyz/openbmc_project/Control/Mode/server.hpp"

#include <fstream>
#include <map>
#include <memory>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
#include <set>
#include <string>
#include <vector>

template <typename... T>
using ServerObject = typename sdbusplus::server::object::object<T...>;
using ModeInterface = sdbusplus::xyz::openbmc_project::Control::server::Mode;
using ModeObject = ServerObject<ModeInterface>;

class ZoneInterface
{
  public:
    virtual ~ZoneInterface() = default;

    virtual double getCachedValue(const std::string& name) = 0;
    virtual void addRPMSetPoint(float setpoint) = 0;
    virtual float getMaxRPMRequest() const = 0;
    virtual bool getFailSafeMode() const = 0;
    virtual float getFailSafePercent() const = 0;
    virtual Sensor* getSensor(std::string name) = 0;
};

/*
 * The PIDZone inherits from the Mode object so that it can listen for control
 * mode changes.  It primarily holds all PID loops and holds the sensor value
 * cache that's used per iteration of the PID loops.
 */
class PIDZone : public ZoneInterface, public ModeObject
{
  public:
    PIDZone(int64_t zone, float minThermalRpm, float failSafePercent,
            const SensorManager& mgr, sdbusplus::bus::bus& bus,
            const char* objPath, bool defer) :
        ModeObject(bus, objPath, defer),
        _zoneId(zone), _maximumRPMSetPt(), _minThermalRpmSetPt(minThermalRpm),
        _failSafePercent(failSafePercent), _mgr(mgr)
    {
#ifdef __TUNING_LOGGING__
        _log.open("/tmp/swampd.log");
#endif
    }

    float getMaxRPMRequest(void) const override;
    bool getManualMode(void) const;

    /* Could put lock around this since it's accessed from two threads, but
     * only one reader/one writer.
     */
    void setManualMode(bool mode);
    bool getFailSafeMode(void) const override;
    int64_t getZoneId(void) const;
    void addRPMSetPoint(float setpoint) override;
    void clearRPMSetPoints(void);
    float getFailSafePercent(void) const override;
    float getMinThermalRpmSetPt(void) const;

    Sensor* getSensor(std::string name) override;
    void determineMaxRPMRequest(void);
    void updateFanTelemetry(void);
    void updateSensors(void);
    void initializeCache(void);
    void dumpCache(void);
    void process_fans(void);
    void process_thermals(void);

    void addFanPID(std::unique_ptr<PIDController> pid);
    void addThermalPID(std::unique_ptr<PIDController> pid);
    double getCachedValue(const std::string& name) override;
    void addFanInput(std::string fan);
    void addThermalInput(std::string therm);

#ifdef __TUNING_LOGGING__
    void initializeLog(void);
    std::ofstream& getLogHandle(void);
#endif

    /* Method for setting the manual mode over dbus */
    bool manual(bool value) override;
    /* Method for reading whether in fail-safe mode over dbus */
    bool failSafe() const override;

  private:
#ifdef __TUNING_LOGGING__
    std::ofstream _log;
#endif

    const int64_t _zoneId;
    float _maximumRPMSetPt = 0;
    bool _manualMode = false;
    const float _minThermalRpmSetPt;
    const float _failSafePercent;

    std::set<std::string> _failSafeSensors;

    std::vector<float> _RPMSetPoints;
    std::vector<std::string> _fanInputs;
    std::vector<std::string> _thermalInputs;
    std::map<std::string, double> _cachedValuesByName;
    const SensorManager& _mgr;

    std::vector<std::unique_ptr<PIDController>> _fans;
    std::vector<std::unique_ptr<PIDController>> _thermals;
};
