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

#include <unistd.h>
#include <time.h>
#include <stdarg.h>

#include <sys/timeb.h>
#include <sys/time.h>

#include "../ShareMemory/shmMem.h"
#include "../Define/define.h"
#include "log.h"

//------------------------------------------------------------------------------
#define YES                                     1
#define NO                                      0

//------------------------------------------------------------------------------
int StoreLogMsg(const char *fmt, ...)
{
    char Buf[4096 + 256] = {0};
    char buffer[4096] = {0};
    int rc = -1;
    va_list args;
    struct timeb  SeqEndTime;
    struct tm *tm;
    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();

    va_start(args, fmt);
    rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);

    ftime(&SeqEndTime);
    SeqEndTime.time = time(NULL);
    tm = localtime(&SeqEndTime.time);

    if (pSysConfig->SwitchDebugFlag == YES) {
        sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
                tm->tm_hour,
                tm->tm_min,
                tm->tm_sec,
                SeqEndTime.millitm,
                buffer);
        printf("%s", Buf);
    } else {
        sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
                tm->tm_year + 1900,
                tm->tm_mon + 1,
                tm->tm_mday,
                tm->tm_hour,
                tm->tm_min,
                tm->tm_sec,
                SeqEndTime.millitm,
                buffer,
                tm->tm_year + 1900,
                tm->tm_mon + 1);
        system(Buf);
    }

    return rc;
}

int StoreEventLogMsg(const char *fmt, ...)
{
    char Buf[4096 + 256];
    char buffer[4096];
    time_t CurrentTime;
    struct tm *tm;
    struct timeval tv;
    va_list args;
    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();

    va_start(args, fmt);
    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);

    memset(Buf, 0, sizeof(Buf));
    CurrentTime = time(NULL);
    tm = localtime(&CurrentTime);
    gettimeofday(&tv, NULL); // get microseconds, 10^-6

    if ((pSysConfig->ModelName != NULL) &&
            (pSysConfig->SerialNumber != NULL) &&
            (strlen((char *)pSysConfig->ModelName) >= 14)) {
        sprintf(Buf, "echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]%s_%s_EventLog",
                tm->tm_year + 1900,
                tm->tm_mon + 1,
                tm->tm_mday,
                tm->tm_hour,
                tm->tm_min,
                tm->tm_sec,
                tv.tv_usec,
                buffer,
                tm->tm_year + 1900,
                tm->tm_mon + 1,
                pSysConfig->ModelName,
                pSysConfig->SerialNumber);
    } else {
        sprintf(Buf, "echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]EventLog",
                tm->tm_year + 1900,
                tm->tm_mon + 1,
                tm->tm_mday,
                tm->tm_hour,
                tm->tm_min,
                tm->tm_sec,
                tv.tv_usec,
                buffer,
                tm->tm_year + 1900,
                tm->tm_mon + 1);
    }

#ifdef SystemLogMessage
    system(Buf);
#endif //SystemLogMessage

#ifdef ConsloePrintLog
    printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec, buffer);
#endif //ConsloePrintLog

    return rc;
}