#ifndef BlinkerNUM_H
#define BlinkerNUM_H

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

class BlinkerNumber
{
    public :
        BlinkerNumber(char _name[])
        {
            numName = (char*)malloc((strlen(_name)+1)*sizeof(char));
            strcpy(numName, _name);
        }
        
        void icon(const String & _icon)
        {
            if (_fresh >> 0 & 0x01) free(nicon);

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

            _fresh |= 0x01 << 0;
        }

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

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

            _fresh |= 0x01 << 1;
        }

        void unit(const String & _unit)
        {
            if (_fresh >> 2 & 0x01) free(nunit);

            nunit = (char*)malloc((_unit.length()+1)*sizeof(char));
            strcpy(nunit, _unit.c_str());

            _fresh |= 0x01 << 2;
        }

        template <typename T>
        void text(T _text)
        {
            // if (isnan(_text)) return;

            if (_fresh >> 3 & 0x01) free(ntext);

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

            _fresh |= 0x01 << 3;
        }
        
        void print(char value)              { _print(STRING_format(value)); }
        void print(unsigned char value)     { _print(STRING_format(value)); }
        void print(int value)               { _print(STRING_format(value)); }
        void print(unsigned int value)      { _print(STRING_format(value)); }       
        void print(long value)              { _print(STRING_format(value)); }        
        void print(unsigned long value)     { _print(STRING_format(value)); }
        void print(double value)            { _print(STRING_format(value)); }
        void print()                        { _print(""); }
    
    private :
        char * numName;
        char * nicon;// = "";
        char * ncolor;// = "";
        char * nunit;// = "";
        char * ntext;
        uint8_t _fresh = 0;

        void _print(const String & value)
        {
            if (_fresh == 0 && value.length() == 0) return;

            String numberData = "";

            if (value.length())
            {
                numberData += BLINKER_F("{\"");
                numberData += BLINKER_F(BLINKER_CMD_VALUE);
                numberData += BLINKER_F("\":");
                numberData += value;
                
                Blinker.printNumArray(numName, value);
            }

            if (_fresh >> 0 & 0x01)
            {
                if (numberData.length()) numberData += BLINKER_F(",");
                else numberData += BLINKER_F("{");

                numberData += BLINKER_F("\"");
                numberData += BLINKER_F(BLINKER_CMD_ICON);
                numberData += BLINKER_F("\":\"");
                numberData += nicon;
                numberData += BLINKER_F("\"");

                free(nicon);
            }
            
            if (_fresh >> 1 & 0x01)
            {
                if (numberData.length()) numberData += BLINKER_F(",");
                else numberData += BLINKER_F("{");

                numberData += BLINKER_F("\"");
                numberData += BLINKER_F(BLINKER_CMD_COLOR);
                numberData += BLINKER_F("\":\"");
                numberData += ncolor;
                numberData += BLINKER_F("\"");

                free(ncolor);
            }
            
            if (_fresh >> 2 & 0x01)
            {
                if (numberData.length()) numberData += BLINKER_F(",");
                else numberData += BLINKER_F("{");

                numberData += BLINKER_F("\"");
                numberData += BLINKER_F(BLINKER_CMD_UNIT);
                numberData += BLINKER_F("\":\"");
                numberData += nunit;
                numberData += BLINKER_F("\"");

                free(nunit);
            }

            if (_fresh >> 3 & 0x01)
            {
                if (numberData.length()) numberData += BLINKER_F(",");
                else numberData += BLINKER_F("{");

                numberData += BLINKER_F("\"");
                numberData += BLINKER_F(BLINKER_CMD_TEXT);
                numberData += BLINKER_F("\":\"");
                numberData += (ntext);
                numberData += BLINKER_F("\"");

                free(ntext);
            }

            numberData += BLINKER_F("}");

            _fresh = 0;

            Blinker.printArray(numName, numberData);
        }
};

#endif