#!/bin/bash
set -euo pipefail

source ${HOME}/bin/script_framework.sh

reportpad=0
retcode=0
showsuccess=1

while getopts "hq" opt; do
	case "${opt}" in
	q)
		showsuccess=0
		;;
	*)
		echo "Usage: $(basename $0) [-hq]"
		echo "       -h  Show help"
		echo "       -q  Quiet (show no success messages)"
		exit 2
		;;
	esac
done

# report is a wrapper to display messages in a certain level with
# added information about the function yielding the result. It
# must be called from within a "sanity_*" function
function report() {
	local levelfunc="$1"
	shift
	local message="$@"
	local func="${FUNCNAME[1]#sanity_}"

	[[ $levelfunc == "success" ]] && [ $showsuccess -eq 0 ] && return || true

	"$levelfunc" "$(printf "%-${reportpad}s" ${func}) ${message}"
}

# Load all part-files from the ~/.config/sanity.d directory
for partFile in "${HOME}/.config/sanity.d"/*.sh; do
	source "${partFile}"
done

# Collect all functions present within the part-files matching the
# "sanity_*" naming schema
parts=($(declare -F | awk '/sanity_[0-9a-zA-Z_-]+$/{ print $3 }'))

# For display reasons store the longest function name to be used in
# report to format the output in columns
for func in "${parts[@]}"; do
	lfunc=$((${#func} - 7)) # 7 = length of stripped "sanity_" prefix
	[ ${lfunc} -lt ${reportpad} ] || reportpad=${lfunc}
done

# Execute all "sanity_*" functions and store exit-code 1 if one of
# them fails to exit gracefully
for func in "${parts[@]}"; do
	"${func}" || retcode=1
done

exit ${retcode}