# Copyright 2012 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors
#   may be used to endorse or promote products derived from this software
#   without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


# Directory where the running script lives.
_Shtk_Cli_DirName="$(dirname "${0}")"


# Base name of the running script.
_Shtk_Cli_ProgName="${0##*/}"


# Maximum level of the logging messages to send to stderr.
_Shtk_Cli_LogLevel=info


shtk_cli_dirname() {
    echo "${_Shtk_Cli_DirName}"
}


shtk_cli_progname() {
    echo "${_Shtk_Cli_ProgName}"
}


shtk_cli_debug() {
    shtk_cli_log_level debug || return 0
    echo "${_Shtk_Cli_ProgName}: D: $*" 1>&2
}


shtk_cli_error() {
    if ! shtk_cli_log_level error; then
        # Avoid calling shtk_cli_error to not enter an infinite loop.
        echo "${_Shtk_Cli_ProgName}: E: Internal error;" \
            "bad _Shtk_Cli_LogLevel ${_Shtk_Cli_LogLevel}" 1>&2
    fi

    echo "${_Shtk_Cli_ProgName}: E: $*" 1>&2
    exit 1
}


shtk_cli_info() {
    shtk_cli_log_level info || return 0
    echo "${_Shtk_Cli_ProgName}: I: $*" 1>&2
}


shtk_cli_log_level() {
    local level="${1}"; shift

    case "${level}" in
        debug)
            case "${_Shtk_Cli_LogLevel}" in
                debug) return 0 ;;
                *) return 1 ;;
            esac
            ;;

        error)
            case "${_Shtk_Cli_LogLevel}" in
                error|warning|info|debug) return 0 ;;
                *) return 1 ;;
            esac
            ;;

        info)
            case "${_Shtk_Cli_LogLevel}" in
                info|debug) return 0 ;;
                *) return 1 ;;
            esac
            ;;

        warning)
            case "${_Shtk_Cli_LogLevel}" in
                warning|info|debug) return 0 ;;
                *) return 1 ;;
            esac
            ;;

        *)
            shtk_cli_error "Invalid log level given to shtk_cli_log_level"
            ;;
    esac
}


shtk_cli_set_log_level() {
    local level="${1}"; shift

    case "${level}" in
        debug|error|info|warning) _Shtk_Cli_LogLevel="${level}" ;;
        *)
            shtk_cli_error "Invalid log level given to shtk_cli_set_log_level"
            ;;
    esac
}


shtk_cli_warning() {
    shtk_cli_log_level warning || return 0
    echo "${_Shtk_Cli_ProgName}: W: $*" 1>&2
}


shtk_cli_usage_error() {
    if ! shtk_cli_log_level error; then
        # Avoid calling shtk_cli_error to not exit without displaying the
        # actual error we want to show.
        echo "${_Shtk_Cli_ProgName}: E: Internal error;" \
            "bad _Shtk_Cli_LogLevel ${_Shtk_Cli_LogLevel}" 1>&2
    fi

    echo "${_Shtk_Cli_ProgName}: E: $*" 1>&2
    echo "Type 'man ${_Shtk_Cli_ProgName}' for help" 1>&2
    exit 1
}
