#pragma once

#include <memory>
#include <vector>

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

class ZoneInterface;

/*
 * Base class for PID controllers.  Each PID that implements this needs to
 * provide an input_proc, setpt_proc, and output_proc.
 */
class PIDController
{
    public:
        PIDController(const std::string& id, ZoneInterface* owner)
            : _owner(owner),
              _setpoint(0),
              _id(id)
        { }

        virtual ~PIDController() { }

        virtual float input_proc(void) = 0;
        virtual float setpt_proc(void) = 0;
        virtual void output_proc(float value) = 0;

        void pid_process(void);

        std::string get_id(void)
        {
            return _id;
        }
        float get_setpoint(void)
        {
            return _setpoint;
        }
        void set_setpoint(float setpoint)
        {
            _setpoint = setpoint;
        }

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

    protected:
        ZoneInterface* _owner;

    private:
        // parameters
        ec::pid_info_t  _pid_info;
        float           _setpoint;
        std::string     _id;
};