#pragma once

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

// required for ei.h to work
#ifndef _REENTRANT
#define _REENTRANT
#endif

#include <ei.h>
#include <ei_connect.h>

#include <unifex/unifex.h>
#include <unifex/cnode.h>
#include <unifex/payload.h>
#include "../../libesl.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef State UnifexState;

UnifexState *unifex_alloc_state(UnifexEnv *env);
void unifex_release_state(UnifexEnv *env, UnifexState *state);
void handle_destroy_state(UnifexEnv *env, UnifexState *state);


#ifdef __cplusplus
  enum LoggerLevel{
    LOGGER_LEVEL_EMERG,
LOGGER_LEVEL_ALERT,
LOGGER_LEVEL_CRIT,
LOGGER_LEVEL_ERROR,
LOGGER_LEVEL_WARNING,
LOGGER_LEVEL_NOTICE,
LOGGER_LEVEL_INFO,
LOGGER_LEVEL_DEBUG
  };
#else
  enum LoggerLevel_t{
    LOGGER_LEVEL_EMERG,
LOGGER_LEVEL_ALERT,
LOGGER_LEVEL_CRIT,
LOGGER_LEVEL_ERROR,
LOGGER_LEVEL_WARNING,
LOGGER_LEVEL_NOTICE,
LOGGER_LEVEL_INFO,
LOGGER_LEVEL_DEBUG
  };
  typedef enum LoggerLevel_t LoggerLevel;
#endif




UNIFEX_TERM global_set_default_logger(UnifexEnv * env, LoggerLevel level);
UNIFEX_TERM connect_timeout(UnifexEnv * env, char * host, int port, char * user, char * password, int timeout);
UNIFEX_TERM send_recv_timed(UnifexEnv * env, char * cmd, int timeout);
UNIFEX_TERM global_set_default_logger_result(UnifexEnv* env);
UNIFEX_TERM connect_timeout_result(UnifexEnv* env);
UNIFEX_TERM connect_timeout_result_error(UnifexEnv* env, char const  * atom);
UNIFEX_TERM send_recv_timed_result_ok(UnifexEnv* env, char const * string);
UNIFEX_TERM send_recv_timed_result_error(UnifexEnv* env, char const  * atom);
UNIFEX_TERM global_set_default_logger_caller(UnifexEnv *env, UnifexCNodeInBuff *in_buff);
UNIFEX_TERM connect_timeout_caller(UnifexEnv *env, UnifexCNodeInBuff *in_buff);
UNIFEX_TERM send_recv_timed_caller(UnifexEnv *env, UnifexCNodeInBuff *in_buff);

int handle_main(int argc, char** argv);

#ifdef __cplusplus
}
#endif
