package ru.nanit.limbo.util;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public final class Logger {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("hh:mm:ss");
    private static int debugLevel = 3;

    private Logger(){}

    public static void setLevel(int level){
        debugLevel = level;
    }

    public static void info(Object msg, Object... args){
        print(Level.INFO, msg, null, args);
    }

    public static void debug(Object msg, Object... args){
        print(Level.INFO, msg, null, args);
    }

    public static void warning(Object msg, Object... args){
        print(Level.WARNING, msg, null, args);
    }

    public static void warning(Object msg, Throwable t, Object... args){
        print(Level.WARNING, msg, t, args);
    }

    public static void error(Object msg, Object... args){
        print(Level.ERROR, msg, null, args);
    }

    public static void error(Object msg, Throwable t, Object... args){
        print(Level.ERROR, msg, t, args);
    }

    public static void print(Level level, Object msg, Throwable t, Object... args){
        if (debugLevel >= level.getIndex()){
            System.out.println(String.format("%s: %s", getPrefix(level), String.format(msg.toString(), args)));
            if (t != null) t.printStackTrace();
        }
    }

    private static String getPrefix(Level level){
        return String.format("[%s] [%s]", getTime(), level.getDisplay());
    }

    private static String getTime(){
        return LocalTime.now().format(FORMATTER);
    }

    public enum Level {

        INFO ("INFO", 0),
        DEBUG ("DEBUG", 1),
        WARNING("WARNING", 2),
        ERROR("ERROR", 3);

        private final String display;
        private final int index;

        Level(String display, int index){
            this.display = display;
            this.index = index;
        }

        public String getDisplay() {
            return display;
        }

        public int getIndex() {
            return index;
        }
    }
}
