#ifndef BlinkerButton_H
#define BlinkerButton_H

#include "../Blinker/BlinkerConfig.h"
#include "../Blinker/BlinkerUtility.h"

class BlinkerButton
{
    public :
        BlinkerButton(char _name[], blinker_callback_with_string_arg_t _func = NULL)
        {
            wNum = Blinker.attachWidget(_name, _func);
        }

        void attach(blinker_callback_with_string_arg_t _func)
        {
            if (wNum == 0) return;

            Blinker.freshAttachWidget(Blinker.widgetName_str(wNum), _func);
        }

        void icon(const String & _icon)
        {
            if (_fresh >> 0 & 0x01) free(bicon);

            bicon = (char*)malloc((_icon.length()+1)*sizeof(char));
            strcpy(bicon, _icon.c_str());

            _fresh |= 0x01 << 0;
        }

        void color(const String & _clr)
        {
            if (_fresh >> 1 & 0x01) free(iconClr);

            iconClr = (char*)malloc((_clr.length()+1)*sizeof(char));
            strcpy(iconClr, _clr.c_str());

            _fresh |= 0x01 << 1;
        }

        template <typename T>
        void content(T _con)
        {
            if (_fresh >> 2 & 0x01) free(bcon);

            String _bcon = STRING_format(_con);
            bcon = (char*)malloc((_bcon.length()+1)*sizeof(char));
            strcpy(bcon, _bcon.c_str());

            _fresh |= 0x01 << 2;
        }

        template <typename T>
        void text(T _text)
        {
            if (_fresh >> 3 & 0x01) free(btext);

            String _btext = STRING_format(_text);
            btext = (char*)malloc((_btext.length()+1)*sizeof(char));
            strcpy(btext, _btext.c_str());

            _fresh |= 0x01 << 3;
        }

        template <typename T1, typename T2>
        void text(T1 _text1, T2 _text2)
        {
            if (_fresh >> 3 & 0x01) free(btext);

            String _btext = STRING_format(_text1);
            btext = (char*)malloc((_btext.length()+1)*sizeof(char));
            strcpy(btext, _btext.c_str());

            _fresh |= 0x01 << 3;

            if (_fresh >> 4 & 0x01) free(btext1);

            _btext = STRING_format(_text2);
            btext1 = (char*)malloc((_btext.length()+1)*sizeof(char));
            strcpy(btext1, _btext.c_str());

            _fresh |= 0x01 << 4;
        }

        void textColor(const String & _clr)
        {
            if (_fresh >> 5 & 0x01) free(textClr);

            textClr = (char*)malloc((_clr.length()+1)*sizeof(char));
            strcpy(textClr, _clr.c_str());

            _fresh |= 0x01 << 5;
        }

        void print() { print(""); }

        void print(const String & _state)
        {
            if ((_fresh == 0 && _state.length() == 0) || \
                wNum == 0)
            {
                return;
            }

            String buttonData;

            if (_state.length())
            {
                buttonData += BLINKER_F("{\"");
                buttonData += BLINKER_F(BLINKER_CMD_SWITCH);
                buttonData += BLINKER_F("\":\"");
                buttonData += (_state);
                buttonData += BLINKER_F("\"");
            }
            
            if (_fresh >> 0 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += BLINKER_F("{");
                
                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_ICON);
                buttonData += BLINKER_F("\":\"");
                buttonData += (bicon);
                buttonData += BLINKER_F("\"");
                
                free(bicon);
            }
            
            if (_fresh >> 1 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += STRING_format(BLINKER_F("{"));
                
                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_COLOR);
                buttonData += BLINKER_F("\":\"");
                buttonData += (iconClr);
                buttonData += BLINKER_F("\"");
                
                free(iconClr);
            }
            
            if (_fresh >> 2 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += BLINKER_F("{");
                
                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_CONTENT);
                buttonData += BLINKER_F("\":\"");
                buttonData += (bcon);
                buttonData += BLINKER_F("\"");
                
                free(bcon);
            }
            
            if (_fresh >> 3 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += BLINKER_F("{");

                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_TEXT);
                buttonData += BLINKER_F("\":\"");
                buttonData += (btext);
                buttonData += BLINKER_F("\"");
                
                free(btext);
            }
            
            if (_fresh >> 4 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += BLINKER_F("{");
                
                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_TEXT1);
                buttonData += BLINKER_F("\":\"");
                buttonData += (btext1);
                buttonData += BLINKER_F("\"");
                
                free(btext1);
            }
            
            if (_fresh >> 5 & 0x01)
            {
                if (buttonData.length()) buttonData += BLINKER_F(",");
                else buttonData += BLINKER_F("{");
                
                buttonData += BLINKER_F("\"");
                buttonData += BLINKER_F(BLINKER_CMD_TEXTCOLOR);
                buttonData += BLINKER_F("\":\"");
                buttonData += (textClr);
                buttonData += BLINKER_F("\"");
                
                free(textClr);
            }

            buttonData += BLINKER_F("}");

            _fresh = 0;

            Blinker.printArray(Blinker.widgetName_str(wNum), buttonData);
        }

    private :
        uint8_t wNum;
        
        char * bicon;
        char * iconClr;
        char * bcon;
        char * btext;
        char * btext1;
        char * textClr;
        uint8_t _fresh = 0;
};

#endif