#ifndef __LOGGER_H__
#define __LOGGER_H__
#include <stdio.h>
#define DEBUG_PREFIX "[DEBG]"
#define INFO_PREFIX  "[INFO]"
#define WARN_PREFIX  "[WARN]"
#define ERROR_PREFIX "[ERRO]"
typedef enum LogLevel {
  LOG_DEBUG = 1,
  LOG_INFO = 2,
  LOG_WARN = 3,
  LOG_ERROR = 4,
} LogLevel;
typedef struct logger_t logger_t;
struct logger_t {
  FILE *debugFile;
  FILE *infoFile;
  FILE *warningFile;
  FILE *errorFile;
  LogLevel minimalLevel;
  logger_t *childLogger; // Duplicate logs to this logger
};
logger_t logger_create(LogLevel minimalLevel, FILE *debugFile, FILE *infoFile, FILE *warningFile,
                     FILE *errorFile, logger_t *childLogger);
void logger_log(logger_t *logger, LogLevel level, const char *file, const char *function, int line, const char *const message, ...);
void logger_debug(logger_t *logger, const char *file, const char *function,
                  int line, const char *const message, ...);
void logger_info(logger_t *logger, const char *file, const char *function,
                 int line, const char *const message, ...);
void logger_warn(logger_t *logger, const char *file, const char *function,
                 int line, const char *const message, ...);
void logger_error(logger_t *logger, const char *file, const char *function,
                  int line, const char *const message, ...);
#endif //__LOGGER_H__