#ifndef Button_h
#define Button_h

#include "Arduino.h"


class Button
{
  public:
    void init(uint8_t pin, int offState = HIGH, bool usePullUp = true);
    void update(unsigned long referenceTime = 0);
    void block() { if (lastState != offState) blocked = true; }

    bool changed() { return !blocked && lastChanged; }
    bool pressed() { return !blocked && lastState != offState; }
    unsigned long pressedMillis(unsigned long referenceTime = 0) { return getTime(referenceTime) - lastPressedTime; }

    unsigned long getDebounceMillis() { return debounceMillis; }
    void setDebounceMillis(unsigned long value) { debounceMillis = value; }

  protected:
    inline unsigned long getTime(unsigned long referenceTime) { return referenceTime == 0 ? millis() : referenceTime; };

  private:
    uint8_t pin = 1;
    int offState = HIGH;
    unsigned long debounceMillis = 50;

    unsigned long lastChangedTime = 0;
    unsigned long lastPressedTime = 0;
    int lastState;
    bool lastChanged;

    bool blocked = false;
};

#endif