#ifndef BLINKER_BRIDGE_H
#define BLINKER_BRIDGE_H

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

class BlinkerBridge
{
    public :
        BlinkerBridge(char _key[], blinker_callback_with_string_arg_t _func = NULL)
        {
            bNum = Blinker.attachBridge(_key, _func);
        }

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

            Blinker.freshAttachBridge(Blinker.bridgeKey(bNum), _func);
        }

        template <typename T1>
        void print(T1 n1)
        {
            BLINKER_LOG_ALL(BLINKER_F("Bridge to: "), bNum, BLINKER_F(", data: "), n1);
            if (strcmp(Blinker.bridgeName(bNum), BLINKER_CMD_FALSE) != 0)
            {
                Blinker.bridgePrint(Blinker.bridgeName(bNum), STRING_format(n1));
            }
        }

        template <typename T1, typename T2>
        void print(T1 n1, T2 n2)
        {
            if (strcmp(Blinker.bridgeName(bNum), BLINKER_CMD_FALSE) != 0)
            {
                String msg = BLINKER_F("{\"");
                msg += STRING_format(n1);
                msg += BLINKER_F("\":\"");
                msg += STRING_format(n2);
                msg += BLINKER_F("\"}");

                Blinker.bridgePrint(Blinker.bridgeName(bNum), msg);
            }
        }

        // void name(char name[])
        // {
        //     _bName = (char*)malloc((strlen(name)+1)*sizeof(char));
        //     strcpy(_bName, name);
        // }
        // char * getName() { return _bName; }
        // void freshBridge(const String & name)
        // {
        //     bridgeName = (char*)malloc((name.length()+1)*sizeof(char));
        //     strcpy(bridgeName, name.c_str());
        // }
        // char * getBridge() { return bridgeName; }
        // bool checkName(char name[]) { return strcmp(_bName, name) == 0; }

    private :
        uint8_t bNum;
};

#endif