#!/bin/bash
# skip crab_syntax

log() {
	# OSV: даты добавлять нельзя!
	echo "$@"
}

define() {
	set | grep "^$@ ()"
}

if ! define error >/dev/null; then
	error() {
		log "Обнаружена ошибка в тесте $0"
	}
fi

if ! define fix >/dev/null; then
	fix() {
		return 1
	}
fi

if ! define fix_ok >/dev/null; then
	fix_ok() {
		log "Исправление удалось"
	}
fi

# Нужно для выполнения внутри timeout
export -f check

main() {
	local angel_error_log="/tmp/angel_error.$$"
	local angel_check_log="/tmp/angel_check.$$"
	# TODO: пробрасывать set -x, если он выставлен внутрь сабшела
	check &> "$angel_check_log"
	ret="$?"
	if [ "$ret" == "0" ]; then
		cat "$angel_check_log"
		rm "$angel_check_log"
		exit 0
	fi
	if [ "$ret" == "124" ]; then
		log "Тест завис"
		cat "$angel_check_log"
		rm "$angel_check_log"
		exit 2
	fi
	error &>"$angel_error_log"
	if fix &>>"$angel_error_log"; then
		if timeout 30 bash -c check &>> "$angel_check_log"; then
			fix_ok &>> "$angel_error_log"
			sed -i 's/FATAL/ALARM/g' "$angel_error_log"
			cat "$angel_error_log"
			cat "$angel_check_log"
			echo "Проблема исправлена автоматически. Нужно посмотреть причины возникновения проблемы, чтобы она не возникала в будущем"
			rm "$angel_error_log"
			rm "$angel_check_log"
			exit 0
		fi
		cat "$angel_error_log"
		cat "$angel_check_log"
		echo "Исправить проблему автоматически не удалось."
		rm "$angel_error_log"
		rm "$angel_check_log"
		exit 2
	fi
	cat "$angel_error_log"
	cat "$angel_check_log"
	rm "$angel_error_log"
	rm "$angel_check_log"
	exit 2
}

main_critical() {
	check
	ret="$?"
	[ "$ret" == "0" ] && exit 0
	if [ "$ret" == "124" ]; then
		log "Тест завис"
		exit 2
	fi
	error
	fix && fix_ok || exit 254
	timeout 30 bash -c check && exit 0
	exit 254
}

if [ $# = 1 ] && fgrep -q "$1() {" "$BASH_SOURCE"; then
	"$1"
fi
