#!/bin/bash
export TEXTDOMAINDIR=/usr/share/locale
export TEXTDOMAIN=runner-gui
MSG01="$(gettext -s "Run app as")"
MSG02="$(gettext -s "Application")"
MSG03="$(gettext -s "User")"
MSG04="$(gettext -s "Authentication failed")"
MSG05="$(gettext -s "Priority (fom -100(RT) to 39)")"
MSG06="$(gettext -s "Wrong value")"
MSG07="$(gettext -s "Authorizaton")"

APPDESKTOP=''
CHECKBOX="--add-combo="${MSG07}:" --combo-values=root|user|sudo"
DEFAUTH=user #default autorization method (user or root)
DEFPRI=0
USER=''
APP=''

zenity_window() {
HEADER="${MSG01}"
CHECKED=no
while [ "$CHECKED"  != 'yes' ]; do
CHECKED='yes'
VALUES=$(zenity --forms --title="$MSG01" \
    --text="${HEADER}:" \
    --separator="#" \
    --add-entry="${MSG02}" \
    --add-entry="${MSG03}:" \
    --add-entry="${MSG05}:" \
    --width=400 \
    --name="runner-gui" \
    --class="Xdialog" \
    $CHECKBOX
) 
[ $? -ne 0 ] && exit ${LINENO}

APP=$(echo $VALUES |cut -f1 -d '#')
USER=$(echo $VALUES |cut -f2 -d '#')
PRI=$(echo $VALUES |cut -f3 -d '#')
[ -z "$PRI" ] && PRI="$DEFPRI"
CHECKAPP=$(check_app "$APP")
[ "$CHECKAPP" == 'notfound' ] && CHECKED="app: $APP"
AUTH=$(echo $VALUES |cut -f4 -d '#')
[ -z "$AUTH" ] && AUTH="$DEFAUTH"
check_user "$USER" || CHECKED="user: $USER"
check_nice "$PRI" || CHECKED="priority: $PRI for $USER"
HEADER="${MSG06}: $CHECKED"
done
}

check_app() {
	APPDESKTOP=$(find /usr/share/applications -type f -name ${1}.desktop |head -n1)
	if [ -f "$APPDESKTOP" ] ; then
		EXEC=$(cat "$APPDESKTOP" |sed -n '/Exec/s/Exec=//p' |cut -f1 -d ' ')
		if command -v "$EXEC" >/dev/null; then
			echo "$EXEC"
			return 0
		fi
	fi
	if command -v  "$1" >/dev/null; then
		echo "$1"
		return 0
	fi
	echo "notfound"
	return 1
}

check_user() {
	[ $1 ] || return 1
	compgen -u "$1" >/dev/null 
}

check_nice() {
	echo $1 | egrep -q '^\-*[[:digit:]]+$' || return 1
	if [ "$AUTH" == 'root' -o "$USER" == 'root' ] ; then
		[ $1 -gt 39 ] && return 2
		[ $1 -lt -100 ] && return 2
	else
		[ $1 -gt 39 ] && return 2
		[ $1 -lt 20 ] && return 2
	fi	
	return 0
}

setpri() {
	PRI=$1
	if [ $PRI -gt -2 ] ; then
		nice=$(( $PRI - 20  ))
		[ $nice -lt -20 ] && nice='-20' 
		echo "nice -n $nice"
	else
		RT=$(( ${PRI:1:${#PRI}} -1 ))
		echo "chrt -rr $RT"
	fi
}

[ $(id -u) -eq 0 ] && CHECKBOX=''


zenity_window

PRIORITY=$(setpri $PRI)

if [ "$AUTH" == 'sudo'  ]  ; then
	ASKPASS="$(dirname $(realpath $0))/zen_askpass"
	SUDO_ASKPASS="$ASKPASS" sudo -A -u "$USER" -- $PRIORITY "$CHECKAPP"
	[ $? != 0 ] && notify-send "$MSG04"
elif [ $(id -u) -eq 0  ] ; then
	$PRIORITY bashsu -u "$USER" -c "$CHECKAPP"
elif [ "$AUTH" == 'root' -a "$USER" != root ]  ; then
	bashsu -u root -c $PRIORITY bashsu -u "$USER" -c "$CHECKAPP"
elif [ "$AUTH" == 'root' -a "$USER" == root ]  ; then
	bashsu -u "$USER" -c $PRIORITY "$CHECKAPP"
else
	echo "something went wrong!"
fi

