#pragma once

#include "controller.hpp"
#include "ec/pid.hpp"
#include "fan.hpp"

#include <limits>
#include <memory>
#include <vector>

namespace pid_control
{

class ZoneInterface;

/*
 * Base class for PID controllers.  Each PID that implements this needs to
 * provide an inputProc, setptProc, and outputProc.
 */
class PIDController : public Controller
{
  public:
    PIDController(const std::string& id, ZoneInterface* owner) :
        Controller(), _owner(owner), _id(id)
    {
        _pid_info.initialized = false;
        _pid_info.ts = static_cast<double>(0.0);
        _pid_info.integral = static_cast<double>(0.0);
        _pid_info.lastOutput = static_cast<double>(0.0);
        _pid_info.proportionalCoeff = static_cast<double>(0.0);
        _pid_info.integralCoeff = static_cast<double>(0.0);
        _pid_info.feedFwdOffset = static_cast<double>(0.0);
        _pid_info.feedFwdGain = static_cast<double>(0.0);
        _pid_info.integralLimit.min = static_cast<double>(0.0);
        _pid_info.integralLimit.max = static_cast<double>(0.0);
        _pid_info.outLim.min = static_cast<double>(0.0);
        _pid_info.outLim.max = static_cast<double>(0.0);
        _pid_info.slewNeg = static_cast<double>(0.0);
        _pid_info.slewPos = static_cast<double>(0.0);
        _pid_info.negativeHysteresis = static_cast<double>(0.0);
        _pid_info.positiveHysteresis = static_cast<double>(0.0);
    }

    virtual ~PIDController() {}

    virtual double inputProc(void) override = 0;
    virtual double setptProc(void) = 0;
    virtual void outputProc(double value) override = 0;

    void process(void) override;

    std::string getID(void) override
    {
        return _id;
    }
    double getSetpoint(void)
    {
        return _setpoint;
    }
    void setSetpoint(double setpoint)
    {
        _setpoint = setpoint;
    }

    ec::pid_info_t* getPIDInfo(void)
    {
        return &_pid_info;
    }

    double getLastInput(void)
    {
        return lastInput;
    }

  protected:
    ZoneInterface* _owner;
    std::string _id;

  private:
    // parameters
    ec::pid_info_t _pid_info;
    double _setpoint = 0;
    double lastInput = std::numeric_limits<double>::quiet_NaN();
};

} // namespace pid_control
