#include <string.h>
#include <errno.h>
#include "mldapchecker.h"
#include "log.h"
#include "mlchecker.h"

static int execute_func(void *handle, const char *func_name) {
    int ret = MLDAPCHECKER_SUCCESS;
    int (*ptr_func)(void) = NULL;

    if(handle == NULL || func_name == NULL)
        goto err;

    if(NULL == (ptr_func=dlsym(handle, func_name)))
        goto err;

    ret = ptr_func();

err:
    return ret;
}

static int checkservicekey() {
    int ret = MLDAPCHECKER_SUCCESS;
    void *handle = NULL;

    dlerror();
    handle = dlopen(MLDAP_LIBRARY, RTLD_LAZY);

    if(handle == NULL) {
        LOGE("mlchecker can't open libMLDAP.so: %s", dlerror());
        return MLDAPCHECKER_ERR_LIBMLDAP;
    }
    if(ret = execute_func(handle, "MLOtaInitialize")) {
        LOGE("mlchecker can't MLOtaInitialize");
        goto err;
    }

    ret = execute_func(handle, "checkServicekey");

    execute_func(handle, "MLOtaDeInitialize");

err:
    dlclose(handle);
    return ret;
}

static int checksdcert() {
    int ret = MLDAPCHECKER_SUCCESS;
    void *handle = NULL;
    dlerror();
    handle = dlopen(MLDAP_LIBRARY, RTLD_LAZY);

    if(handle == NULL){
        LOGE("mlchecker can't open libMLDAP.so: %s", dlerror());
        return MLDAPCHECKER_ERR_LIBMLDAP;
    }

    if(ret = execute_func(handle, "MLOtaInitialize")) {
        LOGE("mlchecker can't MLOtaInitialize");
        goto err;
    }

    ret = execute_func(handle, "checkCert");

    execute_func(handle, "MLOtaDeInitialize");

err:
    dlclose(handle);
    return ret;
}

static int cmdHandler(const uint8_t *cmd) {
    int ret = MLDAPCHECKER_SUCCESS;
    LOGE("mlchecker %s", cmd);

    if(!strcmp(cmd, MLDAP_MSG_CHECK_SERVICE_KEY)) {
        ret = checkservicekey();
    }
    else {
        ret = checksdcert();
    }

    return ret;
}

int main(int argc, char* argv[]) {
    int32_t ret = MLDAPCHECKER_SUCCESS;

    if ( argc == 2 ) {
        ret = cmdHandler((const uint8_t *)argv[1]);
    }
    else {
        ret = MLDAPCHECKER_ERR_NULL_INPUT;
    }

    return ret;
}
