#!/bin/bash
# skip strongbash015
set -eu
__SILENT=TRUE
[ "${__DEBUG:-}" = TRUE ] && { set +x; __DEBUG=FALSE; __SILENT=FALSE; }
. /opt/fox_utils/crab_sys.sh

[ "${1:---help}" = "--help" ] && sys::usage "$@"
### --help Info:  conf commit|set|get|push|pull
### --help Usage: conf commit file.conf|$DIR "Hello comment"
### --help Usage: conf set MYIP 1.2.3.4 file.conf [--escape]
### --help Usage: conf get MYIP file.conf
### --help Usage: conf push|pull [gitorigin]
### --help Example:
sys::arg_parse "$@"

if [ "$ARG_1" = "commit" ]; then
	CONF_DIR="$ARG_2"
	[ -f "$CONF_DIR" -a ! -d "$CONF_DIR" ] && CONF_DIR="${CONF_DIR%/*}"
	cd "$CONF_DIR"
	if [ ! -d .git ]; then
		git init
		echo 'log/' > .gitignore
		echo 'tmp/' >> .gitignore
		echo '*.lock' >> .gitignore
		echo '*.tmp' >> .gitignore
		echo 'var/' >> .gitignore
	fi
	# Для обратной совместимости
	if ! grep -q '^var/$' .gitignore; then
		echo 'var/' >> .gitignore
	fi
	diff_text="$(git diff -U0)"
	git add .
	git_status="$(git status)"
	# skip strongbash034
	if ! git status | grep -qm1 'nothing to commit'; then
		git add .
		git commit -qam "$ARG_3"$'\n'"$diff_text"$'\n'"$git_status"\
			--author="conf-commit <conf-commit@$(hostname)>"
	fi
	exit 0
fi

if [ "$ARG_1" = "get" ]; then
	CONF_FILE="$ARG_3"
	VAR_NAME="$ARG_2"
	set +u
	. "$CONF_FILE"
	set -u
	echo "${!VAR_NAME:-}"
	exit 0
fi

if [ "$ARG_1" = "set" ]; then
	CONF_FILE="$ARG_4"
	VAR_NAME="$ARG_2"
	VAR_VAL="$ARG_3"
	LOCK_FILE="${CONF_FILE}.new.lock"
	if ! /opt/fox_utils/crab_lock "${LOCK_FILE}" $$; then
		echo "File is locked ${LOCK_FILE}, try again later"
		exit 255
	fi
	if [ "${ARG_ESCAPE:-}" = TRUE ] \
		&& [[ "${VAR_VAL}" != \$CONST_* ]]; then
		VAR_VAL="${VAR_VAL//\$/\\$}"
		VAR_VAL="${VAR_VAL//\"/\\\"}"
	fi
	if ! grep "^${VAR_NAME}=" "$CONF_FILE" &>/dev/null; then
		echo "${VAR_NAME}=\"${VAR_VAL}\"" >> "$CONF_FILE"
		exit 0
	fi
	while read -r line; do
		if [[ "$line" != *'='* ]]; then
			echo "$line"
			continue
		fi
		vname="${line%%=*}"
		vval="${line#*=}"
		[ "$vname" = "$VAR_NAME" ] && vval="\"${VAR_VAL}\""
		echo "$vname=${vval}"
	done < "$CONF_FILE" > "${CONF_FILE}.new"
	mv -f "${CONF_FILE}.new" "$CONF_FILE"
	/opt/fox_utils/crab_unlock "${LOCK_FILE}" $$
	exit 0
fi

if [ "$ARG_1" = "unset" ]; then
	CONF_FILE="$ARG_3"
	VAR_NAME="$ARG_2"
	LOCK_FILE="${CONF_FILE}.new.lock"
	if ! /opt/fox_utils/crab_lock "${LOCK_FILE}" $$; then
		echo "File is locked ${LOCK_FILE}, try again later"
		exit 255
	fi
	if ! grep "^${VAR_NAME}=" "$CONF_FILE" &>/dev/null; then
		exit 0
	fi
	while read -r line; do
		if [[ "$line" != *'='* ]]; then
			echo "$line"
			continue
		fi
		vname="${line%%=*}"
		vval="${line#*=}"
		[ "$vname" = "$VAR_NAME" ] && continue
		echo "$vname=${vval}"
	done < "$CONF_FILE" > "${CONF_FILE}.new"
	mv -f "${CONF_FILE}.new" "$CONF_FILE"
	/opt/fox_utils/crab_unlock "${LOCK_FILE}" $$
	exit 0
fi

exit 0
