#pragma once

#include <chrono>

namespace pid_control
{

struct ReadReturn
{
    double value;
    std::chrono::high_resolution_clock::time_point updated;
    double unscaled = value;

    bool operator==(const ReadReturn& rhs) const
    {
        return ((this->value == rhs.value) && (this->updated == rhs.updated) &&
                (this->unscaled == rhs.unscaled));
    }
};

struct ValueCacheEntry
{
    // This is normalized to (0.0, 1.0) range, using configured min and max
    double scaled;

    // This is the raw value, as recieved from the input/output sensors
    double unscaled;
};

/*
 * A ReadInterface is a plug-in for the PluggableSensor and anyone implementing
 * this basically is providing a way to read a sensor.
 */
class ReadInterface
{
  public:
    ReadInterface() {}

    virtual ~ReadInterface() {}

    virtual ReadReturn read(void) = 0;

    virtual bool getFailed(void) const
    {
        return false;
    }
};

/*
 * A WriteInterface is a plug-in for the PluggableSensor and anyone implementing
 * this basically is providing a way to write a sensor.
 */
class WriteInterface
{
  public:
    WriteInterface(int64_t min, int64_t max) : _min(min), _max(max) {}

    virtual ~WriteInterface() {}

    virtual void write(double value) = 0;

    /*
     * A wrapper around write(), with additional parameters.
     * force = true to perform redundant write, even if raw value unchanged.
     * written = non-null to be filled in with the actual raw value written.
     */
    virtual void write(double value, bool force, int64_t* written)
    {
        (void)force;
        (void)written;
        return write(value);
    }

    /*
     * All WriteInterfaces have min/max available in case they want to error
     * check.
     */
    int64_t getMin(void)
    {
        return _min;
    }
    int64_t getMax(void)
    {
        return _max;
    }

  private:
    int64_t _min;
    int64_t _max;
};

} // namespace pid_control
