#!/bin/bash

#
#Copyright 2012 - 2018 CurlyMo, mk01 & mkreisl <development@xbian.org>
#
#This file is part of XBian - XBMC on the Raspberry Pi.
#
#XBian is free software: you can redistribute it and/or modify it under the
#terms of the GNU General Public License as published by the Free Software
#Foundation, either version 3 of the License, or (at your option) any later
#version.
#
#XBian is distributed in the hope that it will be useful, but WITHOUT ANY
#WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
#FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
#details.
#
#You should have received a copy of the GNU General Public License along
#with XBian. If not, see <http://www.gnu.org/licenses/>
#|------------------------------------|
#|          Include files             |
#|------------------------------------|

source $BASEPATH/modules/services/functions
if [ $GUIMODE -eq 1 ]; then
	source $BASEPATH/modules/services/dialogs;
fi

#|------------------------------------|
#|          Global variables          |
#|------------------------------------|

readServicesFn()
{
        SERVICES=(); ISALIAS=(); IDX=()
        for s in $(grep -vE "(^\s*$|^#)" $BASEPATH/config/services); do
		s=$s:; i=${s%%:*}; a=${s#*:}; d=${a%%:*}; a=${a#*:*}; a=${a%:*}
		SERVICES[$i]=$d; [ -n "$a" ] && ISALIAS[$i]=$a
		#echo "index=$i daemon=$d truename=$a"
        done

        getInstalledServicesFn
}

# The arguments this module accepts
ARGUMENTS=(list select status start restart stop autostart insert update delete);
if [ -f "$BASEPATH/config/services" ]; then
        unset SERVICES; unset ISALIAS
        typeset -A SERVICES; typeset -A ISALIAS
        readServicesFn
fi

#|------------------------------------|
#|           Main program             |
#|------------------------------------|

# Executes the GUI version of this module
function showGUIFn() {
        refreshProcessesFn
	showLoadingServiceDlg;
	showServicesListDlg;
	if [ $? -eq 0 ]; then
                SERVICE=$(($RETURN-1));
        	getServiceNameFn $SERVICE
		if [ $RETURN -gt "$(echo ${#SERVICES[@]} )" -o -z "$(echo ${#SERVICES[@]})" ]; then
			showServiceInsertDlg;
			if [ $? -eq 0 ]; then
				IFS=$'\n';
				DATA=($(echo -e "$RETURN"));
				DATA[1]=${DATA[1]// /,};
				IFS=$ORIGINALIFS;
				a=${DATA[1]}; d=${a%%:*}; a=${a#*:*}; a=${a%:*}; [ -n "$a" ] && ISALIAS[${DATA[0]}]=$a
				if checkServiceExistsFn "${DATA[0]}"; then
					updateServiceConfFn ${DATA[0]} ${DATA[1]} 
					if [ $? -eq 0 ]; then
						showServiceInsertedDlg;
                                                readServicesFn
					else
						showErrorDlg;
					fi
					showGUIFn;
				else
					showServiceNotExistsDlg;
					showGUIFn;
				fi
			else
				showGUIFn;
			fi
		else
                        SERVICE=$(($RETURN-1));
                        getServiceNameFn $SERVICE
			showServiceManageDlg $NAME
			if [ $? -eq 0 ]; then
				if [ $RETURN -eq 1 ]; then
					if getServiceAutoStartStatusFn $NAME; then
						showDisableAutoStartServiceDlg;
						if disableAutoStartFn $NAME; then
                                                        showGUIFn
                                                else
							showFailedToDisableAutoStartDlg;
						fi
					else
						showEnableAutoStartServiceDlg;
						if enableAutoStartFn $NAME; then
                                                        showGUIFn
                                                else
							showFailedToEnableAutoStartDlg;
						fi
					fi
				elif [ $RETURN -eq 2 ]; then
					if  getServiceRunningStatusFn $NAME; then
						showRestartServiceDlg
						if ! restartServiceFn $NAME; then
							showFailedToRestartDlg
						else
							showGUIFn
						fi
					else
						showStartServiceDlg
						if ! startServiceFn $NAME; then
							showFailedToStartDlg
						else
							showGUIFn
						fi
					fi
				elif [ $RETURN -eq 3 ]; then
					if getServiceRunningStatusFn $NAME; then
						showStopServiceDlg;
						if ! stopServiceFn $NAME; then
							showFailedToStopDlg;
						else
							showGUIFn;
						fi
					else
						showGUIFn;
					fi
				elif [ $RETURN -eq 4 ]; then
					getServiceConfFn $NAME
					showServiceEditDlg ${DATA[*]};
					if [ $? -eq 0 ]; then
						IFS=$'\n';
                                                DATA=($(echo -e "$RETURN"))
                                                IFS=$ORIGINALIFS;
						DATA[1]=${DATA[1]// /,};
                                                echo ${DATA[0]} ${DATA[1]} >> /run/xbian-config

						a=${DATA[1]}; d=${a%%:*}; a=${a#*:*}; a=${a%:*}; [ -n "$a" ] && ISALIAS[${DATA[0]}]=$a
						if checkServiceExistsFn "${DATA[0]}"; then
							updateServiceConfFn ${DATA[0]} ${DATA[1]}
							if [ $? -eq 0 ]; then
								readServicesFn
								showServiceUpdatedDlg;
							else
								showErrorDlg;
							fi
							showGUIFn;
						else
							showServiceNotExistsDlg;
							showGUIFn;
						fi
					else
						showGUIFn;
					fi
				elif [ $RETURN -eq 5 ]; then
					showServiceConfirmationDlg;
					if [ $? -eq 0 ]; then
						deleteServiceFn $NAME
						if [ $? -eq 0 ]; then
							showServiceDeletedDlg;
							readServicesFn
						else
							showErrorDlg;
						fi
						showGUIFn;
					else
						showGUIFn;
					fi
				fi
			else
				showGUIFn;
			fi
		fi
	fi
}

# Executes the command line version of this module
#  $1 Argument [String]
# status | select | start | stop | restart | autostart | insert | update | delete
#  $2 Service [String]
# autostart
#  $3 Action [String] Possible values 'enable' or 'disable'
# insert | update
#  $3 Daemons
# Returns
# -  5: Running and autostart enabled
# -  4: Running but autostart disabled
# -  3: Not running but autostart enabled
# -  2: Not running and autostart disabled
# -  1: Success
# -  0: Failed
# - -1: Invalid number of arguments
# - -2: Service not available
# - -3: Service already running
# - -4: Service already stopped
# - -5: Autostart already enabled
# - -6: Autostart already disabled
# - -7: Service file does not exists
function showCMDFn() {
	case $1 in
		list)
			if [ $# -eq 1 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					printf "%s\n" ${!SERVICES[@]} | sort 
				else
					echo -7;
				fi
			else
				echo -1;
			fi
		;;
		select)
			if [ $# -eq 2 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					if [[ "${!SERVICES[@]}" =~ "$2" ]]; then
						getServiceConfFn $2;
						echo ${DATA[1]//,/ };
					else
						echo -2;
					fi
				else
					echo -7;
				fi
			else
				/var/lib/dpkg/info/xbian-package-config-shell.postinst triggered
				echo 1;
			fi
		;;
		status)
			if [ $# -eq 1 -o $# -eq 2 ]; then
				refreshProcessesFn
                                [ -n "$2" ] && filter="$2" || filter=''
				if [ -n "$filter" ] && [[ ${!SERVICES[@]} =~ "$2" ]] || [ -z "$filter" ]; then
                                    if [ -f "$BASEPATH/config/services" ]; then
					for NAME in $(printf "%s\n" ${!SERVICES[@]} | sort); do
#					for NAME in ${!SERVICES[@]}; do
                                                [ -n "$filter" -a "$NAME" != "$filter" ] && continue
						RUNNING=$(getServiceRunningStatusFn $NAME; echo $?);
						AUTOSTART=$(getServiceAutoStartStatusFn $NAME; echo $?);
                                                if [ $RUNNING -eq 0 ] && [ $AUTOSTART -eq 0 ]; then
							echo $NAME 5;
						elif [ $RUNNING -eq 1 ] && [ $AUTOSTART -eq 1 ]; then
							echo $NAME 2;
						elif [ $RUNNING -eq 1 ] && [ $AUTOSTART -eq 0 ]; then
							echo $NAME 3;
						else
							echo $NAME 4;
                                                fi
					done;
				    else
					echo -7;
				    fi
                                else
                                    echo -2
                                fi
			else
				echo -1
			fi
		;;
		start)
			if [ $# -eq 2 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					if [[ ${!SERVICES[@]} =~ "$2" ]]; then
						if ! getServiceRunningStatusFn $2; then
							if startServiceFn $2; then
								echo 1;
							else
								echo 0;
							fi;
						else
							echo -3
						fi
					else
						echo -2
					fi
				else
					echo -7;
				fi
			else
				echo -1;
			fi
		;;
		stop)
			if [ $# -eq 2 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					if [[ ${!SERVICES[@]} =~ "$2" ]]; then
						if getServiceRunningStatusFn $2; then
							if stopServiceFn $2; then
								echo 1;
							else
								echo 0;
							fi;
						else
							echo -4
						fi
					else
						echo -2
					fi
				else
					echo -7;
				fi
			else
				echo -1;
			fi
		;;
		restart)
			if [ $# -eq 2 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					if [[ ${!SERVICES[@]} =~ "$2" ]]; then
						if getServiceRunningStatusFn $2; then
							if restartServiceFn $2; then
								echo 1;
							else
								echo 0;
							fi;
						else
							echo -4
						fi
					else
						echo -2
					fi
				else
					echo -7;
				fi
			else
				echo -1;
			fi
		;;
		autostart)
			if [ $# -eq 3 ]; then
				if [ -f "$BASEPATH/config/services" ]; then
					if [[ ${!SERVICES[@]} =~ "$2" ]]; then
						if [ $3 == "disable" ]; then
							if getServiceAutoStartStatusFn $2; then
								if disableAutoStartFn $2; then
									echo 1;
								else
									echo 0;
								fi
							else
								echo -5;
							fi
						elif [ $3 == "enable" ]; then
							if ! getServiceAutoStartStatusFn $2; then
								if enableAutoStartFn $2; then
									echo 1;
								else
									echo 0;
								fi
							else
								echo -6;
							fi
						else
							echo -1;
						fi
					else
						echo -2
					fi
				else
					echo -7;
				fi
			else
				echo -1;
			fi
		;;
		insert|update)
			if [ $# -ge 2 ]; then
				DATA=($2)
				shift;
				shift;
				a=$1; d=${a%%:*}; a=${a#*:*}; a=${a%:*}; [ -n "$a" ] && ISALIAS[${DATA[0]}]=$a
				if [ ! -z "${DATA[0]}" ] && checkServiceExistsFn "${DATA[0]}"; then
					DAEMONS=($@);
					DAEMON=""
					for VALUE in ${DAEMONS[@]}; do
						DAEMON=$DAEMON$VALUE",";
					done;
					DAEMON=$(echo $DAEMON | awk '{print substr($0,0,length)}');
					DATA+=($DAEMON);
					updateServiceConfFn "${DATA[0]}" "${DATA[1]}"
					if [ $? -eq 0 ]; then
						echo 1
					else
						echo 0
					fi
				else
					echo -2
				fi
			else
				echo -1;
			fi
		;;
		delete)
			if [ $# -eq 2 ]; then
				shift;
				if [[ ${!SERVICES[@]} =~ "$1" ]]; then
					if deleteServiceFn "$1"; then
						echo 1
					else
						echo 0
					fi
				else
					echo -2
				fi
			else
				echo -1;
			fi
		;;		
	esac
}
