#!/bin/bash

# Print a message to stderr and terminate the current script
#
# usage: ynh_die "Some message"
ynh_die() {
    echo "$1" 1>&2
    exit 1
}

# Print an "INFO" message
#
# usage: ynh_print_info "Some message"
ynh_print_info() {
    echo "$1" >&$YNH_STDINFO
}

# Print a warning on stderr
#
# usage: ynh_print_warn "Some message"
ynh_print_warn() {
    echo "$1" >&2
}

# Execute a command and redirect stderr to stdout
#
# usage: ynh_hide_warnings your command and args
# | arg: command - command to execute
#
ynh_hide_warnings() {
    # Note that "$@" is used and not $@, c.f. https://unix.stackexchange.com/a/129077
    "$@" 2>&1
}

# Execute a command and redirect stderr in /dev/null. Print stderr on error.
#
# usage: ynh_exec_and_print_stderr_only_if_error your command and args
# | arg: command - command to execute
#
# Note that you should NOT quote the command but only prefix it with ynh_exec_and_print_stderr_only_if_error
#
# Requires YunoHost version 11.2 or higher.
ynh_exec_and_print_stderr_only_if_error() {
    logfile="$(mktemp)"
    rc=0
    # Note that "$@" is used and not $@, c.f. https://unix.stackexchange.com/a/129077
    "$@" 2> "$logfile" || rc="$?"
    if (( rc != 0 )); then
        cat "$logfile" >&2
        ynh_safe_rm "$logfile"
        return "$rc"
    fi
}

# Return data to the YunoHost core for later processing
# (to be used by special hooks like app config panel and core diagnosis)
#
# usage: ynh_return somedata
#
# Requires YunoHost version 3.6.0 or higher.
ynh_return() {
    echo "$1" >>"$YNH_STDRETURN"
}

# Initial definitions for ynh_script_progression
increment_progression=0
previous_weight=0
max_progression=-1
# Set the scale of the progression bar
# progress_string(0,1,2) should have the size of the scale.
progress_scale=20
progress_string2="####################"
progress_string1="++++++++++++++++++++"
progress_string0="...................."

# Print a progress bar showing the progression of an app script
#
# usage: ynh_script_progression "Some message"
#
# Requires YunoHost version 3.5.0 or higher.
ynh_script_progression() {
    set +o xtrace # set +x

    # Compute $max_progression (if we didn't already)
    if [ "$max_progression" = -1 ]; then
        # Get the number of occurrences of 'ynh_script_progression' in the script. Except those are commented.
        local helper_calls=
        max_progression="$(grep --count "^[^#]*ynh_script_progression" $0)"
    fi

    # Increment each execution of ynh_script_progression in this script by the weight of the previous call.
    increment_progression=$(($increment_progression + $previous_weight))
    # Store the weight of the current call in $previous_weight for next call
    previous_weight=1

    # Reduce $increment_progression to the size of the scale
    local effective_progression=$(($increment_progression * $progress_scale / $max_progression))

    # If last is specified, fill immediately the progression_bar

    # Build $progression_bar from progress_string(0,1,2) according to $effective_progression and the weight of the current task
    # expected_progression is the progression expected after the current task
    local expected_progression="$((($increment_progression + $weight) * $progress_scale / $max_progression - $effective_progression))"

    # Hack for the "--last" message
    if grep -qw 'completed' <<< "$1";
    then
         effective_progression=$progress_scale
         expected_progression=0
    fi
    # left_progression is the progression not yet done
    local left_progression="$(($progress_scale - $effective_progression - $expected_progression))"
    # Build the progression bar with $effective_progression, work done, $expected_progression, current work and $left_progression, work to be done.
    local progression_bar="${progress_string2:0:$effective_progression}${progress_string1:0:$expected_progression}${progress_string0:0:$left_progression}"

    echo "[$progression_bar] > ${1}" >&$YNH_STDINFO
    set -o xtrace # set -x
}
