//
//  HCLogger.m
//  HCLogger
//
//  Created by ChenYuanfu on 2018/4/27.
//  Copyright © 2018年 ZeroZero. All rights reserved.
//

#import "HCLogger.h"
#import <UIKit/UIKit.h>

#define DDLogFlagFile (1 << 11)

#if DEBUG
static const DDLogLevel ddLogLevel =  DDLogLevelDebug | DDLogFlagFile;
#else
static const DDLogLevel ddLogLevel =  DDLogLevelError | DDLogFlagFile;
#endif

#define DDLogFile(frmt, ...)    LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagFile, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)

NSString *const kLastActiveDate = @"LastActiveDate";

@interface HCLogger()

@property (nonatomic, strong) DDFileLogger *fileLogger;

@property (nonatomic, strong) HCLogFormatter <DDLogFormatter>*logFormatter;

@end

@implementation HCLogger

+ (instancetype)sharedLogger {
  static id instance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [HCLogger new];
    [instance setupLoggers];
  });
  return instance;
}

#pragma mark - Configuration
- (void)setupLoggers {
  
  if (self.fileLogger) {
    return;
  }
  
  // TTY = Xcode console
  [DDLog addLogger:[DDTTYLogger sharedInstance]];
  
  // File Logger
  DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
  
  // Defalule 1Day
  fileLogger.rollingFrequency = 60 * 60 * 24 ;
  
  // Default 5Mb
  fileLogger.maximumFileSize  = 5 * 1024 * 1024;
  
  // Defaulat 20.
  [fileLogger.logFileManager setMaximumNumberOfLogFiles:20];
  
  [DDLog addLogger:fileLogger];
  self.fileLogger = fileLogger;
  
  // Add logger formatter
  [DDTTYLogger sharedInstance].logFormatter = self.logFormatter;
  fileLogger.logFormatter = self.logFormatter;
  
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
  
  [[self sortedLogFileIofos] enumerateObjectsUsingBlock:^(DDLogFileInfo * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"path:%@", obj.filePath);
  }];
  
}

- (void)setRollingFrequency:(NSTimeInterval)rollingFrequency {
  self.fileLogger.rollingFrequency = rollingFrequency;
}

- (NSTimeInterval)rollingFrequency {
  return self.fileLogger.rollingFrequency;
}

- (void)setMaximumFileSize:(unsigned long long)maximumFileSize {
  self.fileLogger.maximumFileSize = maximumFileSize;
}

- (unsigned long long)maximumFileSize {
  return self.fileLogger.maximumFileSize;
}

- (void)setMaximumNumberOfLogFiles:(NSUInteger)maximumNumberOfLogFiles {
  self.fileLogger.logFileManager.maximumNumberOfLogFiles = maximumNumberOfLogFiles;
}

- (NSUInteger)maximumNumberOfLogFiles {
  return self.fileLogger.logFileManager.maximumNumberOfLogFiles;
}

#pragma mark - Log

- (void)file:(NSString *)frmt, ...{
  va_list arglist;
  va_start(arglist, frmt);
  DDLogFile(@"%@", [[NSString alloc] initWithFormat:frmt arguments:arglist]);
  va_end(arglist);
}

- (void)error:(NSString *)frmt, ...{
  va_list arglist;
  va_start(arglist, frmt);
  DDLogError(@"%@", [[NSString alloc] initWithFormat:frmt arguments:arglist]);
  va_end(arglist);
}

- (void)warn:(NSString *)frmt, ...{
  va_list arglist;
  va_start(arglist, frmt);
  DDLogWarn(@"%@", [[NSString alloc] initWithFormat:frmt arguments:arglist]);
  va_end(arglist);
}

- (void)info:(NSString *)frmt, ...{
  va_list arglist;
  va_start(arglist, frmt);
  DDLogInfo(@"%@", [[NSString alloc] initWithFormat:frmt arguments:arglist]);
  va_end(arglist);
}

- (void)debug:(NSString *)frmt, ...{
  va_list arglist;
  va_start(arglist, frmt);
  DDLogDebug(@"%@", [[NSString alloc] initWithFormat:frmt arguments:arglist]);
  va_end(arglist);
}

#pragma mark - File managing.

- (void)rollLogFileWithCompletionBlock:(void (^)(void))completionBlock {
  [self.fileLogger rollLogFileWithCompletionBlock:completionBlock];
}

- (NSArray <DDLogFileInfo *>*)sortedLogFileIofos {
  return [self.fileLogger.logFileManager sortedLogFileInfos];
}

- (NSTimeInterval)updateActiveDate {
  NSDate *lastActiveDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastActiveDate];
  NSDate *now            = [NSDate date];
  [[NSUserDefaults standardUserDefaults] setObject:now forKey:kLastActiveDate];
  return [now timeIntervalSinceDate:lastActiveDate];
}

- (void)applicationWillTerminate:(NSNotification *)notification {
  [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:kLastActiveDate];
}

#pragma mark - lazy

- (HCLogFormatter<DDLogFormatter> *)logFormatter {
  if (!_logFormatter) {
    _logFormatter = [HCLogFormatter new];
  }
  return _logFormatter;
}

@end
