#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
#include <getopt.h>

#include "ipc_session.h"

typedef struct _mqtt_demo_s
{
    ipc_session_t *session;
    char data[128];         // my data
} mqtt_demo_var_t;

int on_message(void *obj, ipc_msg_t *msg)
{
    mqtt_demo_var_t *var = (mqtt_demo_var_t *)obj;

    printf("data:%s topic:%s\n\t%s\n", var->data, msg->topic, msg->payload);
    return 0;
}

static int on_state_change(void *obj, int state)
{
    mqtt_demo_var_t *var = (mqtt_demo_var_t *)obj;

    printf("data:%s state change to %d \n", var->data, state);
    return 0;
}

static int mqtt_demo_init(mqtt_demo_var_t *var)
{
    ipc_session_t *session = ipc_session_new("mqtt_demo", (void *)var, IPC_MQTT);
    ipc_session_subscribe(session, "mqtt_demo/+");
    ipc_session_set_callbacks(session, on_message, on_state_change);

    strcpy(var->data, "Hello Word");
    if (ipc_session_start(session) != 0)
    {
        fprintf(stderr, "init failed");
        return -1;
    }
    var->session = session;
    return 0;
}

static void mqtt_demo_loop(mqtt_demo_var_t *var)
{
    const char *msg = "I am a NNG session Client";
    while (1)
    {
        ipc_session_publish(var->session, "mqtt_demo/TEST", (unsigned char *) msg, strlen(msg));
        printf("PUB\n");
        sleep(10);
    }
}

int main(int argc, char **argv)
{

    mqtt_demo_var_t var = {0};

    memset(&var, 0, sizeof(var));

    mqtt_demo_init(&var);
    mqtt_demo_loop(&var);

    ipc_session_destroy_and_free(var.session);
    return 0;
}
