#pragma once

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

#include <limits>
#include <string>

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.checkHysterWithSetpt = 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.derivativeCoeff = 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);
    }

    ~PIDController() override = default;

    double inputProc(void) override = 0;
    virtual double setptProc(void) = 0;
    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;
    }

    double calPIDOutput(double setpt, double input, ec::pid_info_t* info);

  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
