#include <stdio.h>
#include <stdarg.h>

#include "ulog.h"
#include "common_types.h"
#include "ulog_api.h"

#define LOG_MSG_SZ      1024

ulog_t *ulog_init(const char *module_name, u8 is_print)
{
    ulog_t *log;
    u32 len = strlen(module_name);
    
    if (len > MAX_MODULE_NAME_SZ) {
        fprintf(stderr, "The length:%d of module_name can't more than %d", len, MAX_MODULE_NAME_SZ);
        return NULL;
    }

    log = (ulog_t *)malloc(sizeof(*log));
    if (log == NULL) {
        fprintf(stderr, "Allocating log memory is failure");
        return NULL;
    }
    strncpy(log->module_name, module_name, len);

    int opt = LOG_PERROR |LOG_PID;
    if (is_print > 0) {
        opt |= LOG_CONS;
    }
    openlog(log->module_name, opt,  LOG_USER);

    return log;
}

void ulog_close(ulog_t *log)
{
    if (log != NULL) {
        free(log);
    }
    closelog();    
}

void ulog_record(const ulog_t *log, int level, const char *fmt, ...)
{
    if (log == NULL) {
        fprintf(stderr, "Log is null");
        return;
    }

    char log_buf[LOG_MSG_SZ];
    va_list args;
    va_start(args, fmt);       
    vsnprintf(log_buf, sizeof(log_buf), fmt, args);
    va_end(args);
    syslog(level, MODULE_FMT" %s", log->module_name, log_buf);   
}