#!/bin/bash
# Logging library for Bash
# Copyright (c) 2012 Yu-Jie Lin
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is furnished to do
# so, subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

# Modified from https://github.com/livibetter/log.sh/releases/tag/v0.3

LS_OUTPUT=${LS_OUTPUT:-/dev/stdout}
# XXX need more flexible templating, currently manual padding for level names
#LS_DEFAULT_FMT=${LS_DEFAULT_FMT:-'[${_LS_LEVEL_STR}][${FUNCNAME[1]}:${BASH_LINENO[0]}]'}
LS_DEFAULT_FMT=${LS_DEFAULT_FMT:-'%-10s %s [%s:%s]\n'}

LS_DEBUG_LEVEL=10
LS_INFO_LEVEL=20
LS_WARNING_LEVEL=30
LS_ERROR_LEVEL=40
LS_CRITICAL_LEVEL=50
LS_LEVEL=${LS_LEVEL:-${LS_DEBUG_LEVEL}}
# LS_LEVELS structure:
# Level, Level Name, Level Format, Before Log Entry, After Log Entry
LS_LEVELS=(
  ${LS_DEBUG_LEVEL}    '[DEBUG]'    '\e[0;32m'    '\e[0m'
  ${LS_INFO_LEVEL}     '[INFO]'     '\e[0;34m'    '\e[0m'
  ${LS_WARNING_LEVEL}  '[WARNING]'  '\e[0;33m'    '\e[0m'
  ${LS_ERROR_LEVEL}    '[ERROR]'    '\e[0;31m'    '\e[0m'
  ${LS_CRITICAL_LEVEL} '[CRITICAL]' '\e[0;37;41m' '\e[0m'
)

_LS_FIND_LEVEL_STR () {
local LEVEL=${1}
local i
_LS_LEVEL_STR="${LEVEL}"
for ((i=0; i<${#LS_LEVELS[@]}; i+=4)); do
  if [[ "${LEVEL}" == "${LS_LEVELS[i]}" ]]; then
    _LS_LEVEL_STR="${LS_LEVELS[i+1]}"
    #_LS_LEVEL_BEGIN="${LS_LEVELS[i+2]}"
    #_LS_LEVEL_END="${LS_LEVELS[i+3]}"
    return 0
  fi
done
_LS_LEVEL_BEGIN=""
_LS_LEVEL_END=""
return 1
}

# General logging function
# ${1}: Level
LSLOG () {
  local LEVEL=${1}
  shift
  (( LEVEL < LS_LEVEL )) && return 0
  _LS_FIND_LEVEL_STR ${LEVEL}
  # if no message was passed, read it from STDIN
  local _MSG
  [[ $# -ne 0 ]] && _MSG="$@" || _MSG="$(cat)"
  printf "${LS_DEFAULT_FMT}" "${_LS_LEVEL_STR}" "${_MSG}" "$(basename ${BASH_SOURCE[1]})" "${BASH_LINENO[0]}" >> "${LS_OUTPUT}"
}

# Log Call Stack
LSCALLSTACK () {
  local i=0
  local FRAMES=${#BASH_LINENO[@]}
  if [ "${FRAMES}" -gt "4" ]; then
    local start=3
  else 
    local start=0
  fi
  # starts at 3 to skips LSCALLSTACK and __onErr, the last one in arrays
  # for ((i=$start; i<${FRAMES}-1; i++)); do
    # echo '  File' \"${BASH_SOURCE[i+1]}\", line ${BASH_LINENO[i]}, in ${FUNCNAME[i+1]} >> "${LS_OUTPUT}"
    # Grab the source code of the line
    # sed -E -n ${BASH_LINENO[i]}'s/^[:space:]*/    /p' "${BASH_SOURCE[i+1]}" >> "${LS_OUTPUT}"
    # TODO extract arugments from "${BASH_ARGC[@]}" and "${BASH_ARGV[@]}"
    # It requires `shopt -s extdebug'
  # done
}

alias LSDEBUG='LSLOG 10'
alias LSINFO='LSLOG 20'
alias LSWARNING='LSLOG 30'
alias LSERROR='LSLOG 40'
alias LSCRITICAL='LSLOG 50'
alias LSLOGSTACK='LSDEBUG Stack trace ; LSCALLSTACK'