#ifndef BLINEKR_TICKER_H
#define BLINEKR_TICKER_H

#if defined(ARDUINO)
    #if ARDUINO >= 100
        #include <Arduino.h>
    #else
        #include <WProgram.h>
    #endif
#endif

#include "../Blinker/BlinkerDebug.h"

extern "C" {
    typedef void (*blinker_callback_t)(void);
}

class BlinkerTicker
{
    public :
        BlinkerTicker() {}
            // : day_time(0)
            // , os_time(0)
        // {}

        // void freshTime(uint32_t time_s) { day_time = time_s; os_time = millis(); }

        void attach(uint32_t seconds, blinker_callback_t func)
        {
            aim_time = seconds;
            tickerFunc = func;

            isRun = true;
        }

        void detach() { isRun = false; }

        void run()
        {
            if (millis() - os_time >= 1000 && millis() - os_time < 2000)
            {
                os_time += 1000;
                tick_time ++;
            }
            else if (millis() - os_time >= 2000)
            {
                tick_time += (millis() - os_time) / 1000;
                os_time = millis();
            }

            if (isRun)
            {
                if (tick_time - aim_time >= 0 && tick_time - aim_time < 60)
                {
                    BLINKER_LOG_ALL(BLINKER_F("ticker trigged"));
                    isRun = false;

                    if (tickerFunc) tickerFunc();
                }
            }
        }

    protected :
        uint32_t tick_time;
        uint32_t os_time;
        uint32_t aim_time;
        bool     isRun = false;

        blinker_callback_t tickerFunc = NULL;
};

#endif