#include <pzk_dispatcher.h>
#include <stdlib.h>
#include <string.h>
#include <zookeeper/zookeeper.h>

void pzk_watcher_cb(
    zhandle_t*  zh,
    int         type,
    int         state,
    const char* path,
    void*       _watcher
) {
    pzk_watcher_t*    watcher    = (pzk_watcher_t*) _watcher;
    pzk_dispatcher_t* dispatcher = watcher->dispatcher;
    pzk_channel_t*    channel    = dispatcher->channel;

    pzk_event_t* event = new_pzk_event(type, state, path, watcher->ctx);
    channel->push(channel, (void*) event);

    dispatcher->notify(dispatcher);
}

void pzk_auth_cb(int ret, const void* _watcher) {
    pzk_watcher_t*    watcher    = (pzk_watcher_t*) _watcher;
    pzk_dispatcher_t* dispatcher = watcher->dispatcher;
    pzk_channel_t*    channel    = dispatcher->channel;

    pzk_event_t* event = new_pzk_event(0, ret, NULL, watcher->ctx);
    channel->push(channel, (void*) event);

    dispatcher->notify(dispatcher);
}

void destroy_pzk_event(pzk_event_t* event) {
    if (event->path) {
        free(event->path);
    }
    free(event);
}

pzk_event_t* new_pzk_event(int type, int state, const char* path, void* arg) {
    pzk_event_t* event = (pzk_event_t*) calloc(1, sizeof(pzk_event_t));
    event->type    = type;
    event->state   = state;
    event->arg     = arg;
    event->destroy = destroy_pzk_event;

    if (path) {
        char* path_copy = calloc(strlen(path) + 1, sizeof(char));
        strcpy(path_copy, path);
        event->path = path_copy;
    } else {
        event->path = NULL;
    }

    return event;
}