//
//  MBIMLogging.m
//  kordophoned
//
//  Created by James Magahern on 1/22/19.
//  Copyright © 2019 James Magahern. All rights reserved.
//

#import "MBIMLogging.h"
#import <os/log.h>

#define ESC(inner) "\033[" inner "m"
#define CLR ESC("0")
#define BLD "1;"
#define RED "31;"

static os_log_t MBIMOSLog(void) 
{
    static dispatch_once_t onceToken;
    static os_log_t customLog = NULL;
    dispatch_once(&onceToken, ^{
        customLog = os_log_create("net.buzzert.kordophoned", "General");
    });

    return customLog;
}

extern void __MBIMLogCommon(MBIMLogLevel level, NSString *format, ...)
{
    va_list args;
    va_start(args, format);
    NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);

    if (getenv("NSRunningFromLaunchd") != NULL) {
        // Running with launchd, use oslog. 
        os_log_t mbimlog = MBIMOSLog();

        switch (level) {
            case ML_INFO:
                os_log_debug(mbimlog, "%{public}@", message);
                break;
            case ML_NOTIFY:
                os_log_info(mbimlog, "%{public}@", message);
                break;
            case ML_FATAL:
            case ML_ERROR:
                os_log_error(mbimlog, "%{public}@", message);
                break;
        }
    } else {
        // Otherwise, write to stdout.
        static dispatch_once_t onceToken;
        static NSDateFormatter *dateFormatter = nil;
        dispatch_once(&onceToken, ^{
            dateFormatter = [[NSDateFormatter alloc] init];
            dateFormatter.dateFormat = @"Y-MM-d HH:mm:ss";
        });
        
        const char *c_fmt = "%s";
        if (level == ML_NOTIFY) {
            // BOLD
            c_fmt = ESC(BLD) "%s";
        } else if (level == ML_ERROR) {
            c_fmt = ESC(RED) "%s";
        } else if (level == ML_FATAL) {
            c_fmt = ESC(BLD RED) "%s";
        }
        
        NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]];
        fprintf(stdout, "%s: ", [dateStr UTF8String]);
        fprintf(stdout, c_fmt, [message UTF8String]);
        fprintf(stdout, CLR "\n");
    }
}
