--
-- logger.lua
--
-- Copyright (c) 2016 rxi
--
-- This library is free software; you can redistribute it and/or modify it
-- under the terms of the MIT license. See LICENSE for details.
--
-- modified by Jack Liu <https://aituyaa.com>
-- 

local logger = { _version = "0.1.0" }

logger.usecolor = true
-- logger.outfile = nil
logger.outfile = "../lua/log.txt"
logger.level = "trace"


local modes = {
  { name = "trace", color = "\27[34m", },
  { name = "debug", color = "\27[36m", },
  { name = "info",  color = "\27[32m", },
  { name = "warn",  color = "\27[33m", },
  { name = "error", color = "\27[31m", },
  { name = "fatal", color = "\27[35m", },
}


local levels = {}
for i, v in ipairs(modes) do
  levels[v.name] = i
end


local round = function(x, increment)
  increment = increment or 1
  x = x / increment
  return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment
end


local _tostring = tostring

local tostring = function(...)
  local t = {}
  for i = 1, select('#', ...) do
    local x = select(i, ...)
    if type(x) == "number" then
      x = round(x, .01)
    end
    t[#t + 1] = _tostring(x)
  end
  return table.concat(t, " ")
end


for i, x in ipairs(modes) do
  local nameupper = x.name:upper()
  logger[x.name] = function(...)
    
    -- Return early if we're below the log level
    if i < levels[logger.level] then
      return
    end

    local msg = tostring(...)
    local info = debug.getinfo(2, "Sl")
    local lineinfo = info.short_src .. ":" .. info.currentline

    -- Output to console
    print(string.format("%s[%-6s%s]%s %s: %s",
                        logger.usecolor and x.color or "",
                        nameupper,
                        os.date("%H:%M:%S"),
                        logger.usecolor and "\27[0m" or "",
                        lineinfo,
                        msg))

    -- Output to log file
    if logger.outfile then
      local fp = io.open(logger.outfile, "a")
      local str = string.format("[%-6s%s] %s: %s\n",
                                nameupper, os.date(), lineinfo, msg)
      fp:write(str)
      fp:close()
    end

  end
end


local slogan = [[ 
-----------------------------------------------------------------
  _        ___     ____    ____   _____   ____  
 | |      / _ \   / ___|  / ___| | ____| |  _ \ 
 | |     | | | | | |  _  | |  _  |  _|   | |_) |
 | |___  | |_| | | |_| | | |_| | | |___  |  _ < 
 |_____|  \___/   \____|  \____| |_____| |_| \_\  initial@rime-jk

-----------------------------------------------------------------
]]
      
logger.info(slogan)

return logger