#ifndef BRIDGE_H
#define BRIDGE_H

#include "Component.h"
#include <WString.h>
#include <types.h>
#include <enums.h>
#include <macros.h>

class SComponentInfo;

class SComponentInfo
{
public:
    short key;
    void *instance;
    String methodName;
    ComponentFnPtr mPtr;
    SComponentInfo() {}
    SComponentInfo(ushort _key, void *_instance, String _methodName, ComponentFnPtr _mPtr) : key(_key),
                                                                                      instance(_instance),
                                                                                      methodName(_methodName),
                                                                                      mPtr(_mPtr) {}
};

class Bridge : public Component
{
public:
    Bridge(Component *_owner);
    
    SComponentInfo *registerMemberFunction(
        ushort id,
        Component *clazz,
        char *method,
        ComponentFnPtr ptr);

    SComponentInfo *hasMethod(ushort id, String method);
    
    virtual short onMessage(int id, E_CALLS verb, E_MessageFlags flags, const void *user, Component *src);
    short list();
    
    // Component implementation
    short debug();
    short setup();    

    static constexpr char *METHOD_DELIMITER = C_STR(":");
};
#endif

