#!/bin/bash

# Yad based front-end to dpkg & apt as an alternative for gdebi-gtk/kde tools
# Copyright Paweł "pavroo" Pijanowski 2018-2025 under GNU GPL
# Last update 2025/06/02

# get default's locale file
DEFLOCDIR="/usr/share/sparky/debi-tool"
if [ "`cat /etc/default/locale | grep LANG= | grep de`" != "" ]; then
. $DEFLOCDIR/de
elif [ "`cat /etc/default/locale | grep LANG= | grep el`" != "" ]; then
. $DEFLOCDIR/el
elif [ "`cat /etc/default/locale | grep LANG= | grep es`" != "" ]; then
	if [ "`cat /etc/default/locale | grep LANG= | grep es_AR`" != "" ]; then
. $DEFLOCDIR/es_AR
	else
. $DEFLOCDIR/es_ES
	fi
elif [ "`cat /etc/default/locale | grep LANG= | grep fi`" != "" ]; then
. $DEFLOCDIR/fi
elif [ "`cat /etc/default/locale | grep LANG= | grep fr`" != "" ]; then
. $DEFLOCDIR/fr
elif [ "`cat /etc/default/locale | grep LANG= | grep hu`" != "" ]; then
. $DEFLOCDIR/hu
elif [ "`cat /etc/default/locale | grep LANG= | grep id_ID`" != "" ]; then
. $DEFLOCDIR/id_ID
elif [ "`cat /etc/default/locale | grep LANG= | grep it`" != "" ]; then
. $DEFLOCDIR/it
elif [ "`cat /etc/default/locale | grep LANG= | grep ja`" != "" ]; then
. $DEFLOCDIR/ja
elif [ "`cat /etc/default/locale | grep LANG= | grep pl`" != "" ]; then
. $DEFLOCDIR/pl
elif [ "`cat /etc/default/locale | grep LANG= | grep pt_BR`" != "" ]; then
. $DEFLOCDIR/pt_BR
elif [ "`cat /etc/default/locale | grep LANG= | grep ru`" != "" ]; then
. $DEFLOCDIR/ru
elif [ "`cat /etc/default/locale | grep LANG= | grep uk`" != "" ]; then
. $DEFLOCDIR/uk
else
. $DEFLOCDIR/en
fi

DIALOG700="yad --window-icon=application-x-deb --width=750 --height=600 --center"
DIALOG="yad --window-icon=application-x-deb --width=500 --height=300 --fixed --center"
TITLE="--always-print-result --dialog-sep --image=application-x-deb --title="
TEXT="--text="
FILESELECTION="--file "
FILTER="--file-filter"
MSGBOX="--button=Ok:0"
TITLETEXT="DEBiTool"
TEMPFILE="/tmp/debitool/debitoolconf"
TEMPDIR="/tmp/debitool"
BUTTONREMOVE="--button=$LOCAL8:3"
BUTTONREINSTALL="--button=$LOCAL9:4"
BUTTONINSTALL="--button=$LOCAL10:0"
#BUTTONREPOINSTALL="--button=$LOCAL28:5"
BUTTONEXIT="--button=$LOCAL12:1"
ARCH64="`uname -m | grep x86_64`"
ARCH32="`uname -m | grep 686`"
ARCHARM="`uname -m | grep arm`"
#PINGTEST=$(ping -c 1 debian.org | grep [0-9])
if [ -f /usr/bin/sparky-xterm ]; then
	XTERM="/usr/bin/sparky-xterm"
elif [ -f /usr/bin/x-terminal-emulator ]; then
	XTERM="/usr/bin/x-terminal-emulator"
else
	echo "sparky-xterm or x-terminal-emulator is missing... Exiting..."
	exit 1
fi

if [ -d $TEMPDIR ]; then
	rm -rf $TEMPDIR
fi
mkdir -p $TEMPDIR

if [ "$1" = "" ]; then
	echo "Usage of debi-tool is as follows:"
	echo "debi-tool <package.deb>"
	echo ""

	DEBFILE=`$DIALOG700 $TITLE"$TITLETEXT" $FILESELECTION $FILTER="deb file |*.deb"`
	if [ "$?" != "0" ]; then
		exit 1
	else
		cp $DEBFILE $TEMPDIR
		DEBFILE="$DEBFILE"
	fi
fi

if [ "$1" != "" ]; then
	cp $1 $TEMPDIR
	# check the deb
	cd $TEMPDIR
	DEBFILE=`ls | grep *.deb`
	if [ "$DEBFILE" = "" ]; then
		$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL2\n\n$LOCAL3"
		exit 1
	fi
fi

cd $TEMPDIR
# check the deb version
#ar x $DEBFILE
#if [ -f $TEMPDIR/control.tar.gz ] || [ -f $TEMPDIR/control.tar.xz ]; then
#	echo "found control.tar.* file"
#else
#	$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL23\n\n$LOCAL3"
#	exit 1
#fi

#if [ -f control.tar.gz ]; then
#	echo "untar control.tar.gz"
#	tar xfvz control.tar.gz
#elif [ -f control.tar.xz ]; then
#	echo "unxz control.tar.xz"
#	unxz control.tar.xz
#	tar -xf control.tar
#fi

#if [ ! -f control ]; then
#	$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL5\n\n$LOCAL3"
#	exit 1
#fi

# get info about the deb
dpkg-deb --info $DEBFILE >> $TEMPFILE

DEBNAME=`cat $TEMPFILE | grep Package | cut -f3 -d " "`
cat $TEMPFILE | grep Package | cut -f3 -d " " >> $TEMPDIR/debname
DEBVER=`cat $TEMPFILE | grep Version | cut -f3 -d " "`
DEBARCH=`cat $TEMPFILE | grep Architecture | cut -f3 -d " "`
DEBSIZE=`cat $TEMPFILE | grep Installed-Size | cut -f3 -d " "`
#DEBMAINT=`cat control | grep Maintainer`
#DEBDEPS=`cat control | grep Depends`
#DEBDESCR=`cat control | grep Description`

# check arch
if [ "$ARCH64" != "" ]; then
	if [ "$DEBARCH" = "i386" ] || [ "$DEBARCH" = "armhf" ] || [ "$DEBARCH" = "aarch64" ]; then
		$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL20\n\n$LOCAL3"
		exit 1
	fi
elif [ "$ARCH32" != "" ]; then
	if [ "$DEBARCH" = "amd64" ] || [ "$DEBARCH" = "armhf" ] || [ "$DEBARCH" = "aarch64" ]; then
		$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL20\n\n$LOCAL3"
		exit 1
	fi
elif [ "$ARCHARM" != "" ]; then
	if [ "$DEBARCH" = "i386" ] || [ "$DEBARCH" = "amd64" ] || [ "$DEBARCH" = "aarch64" ]; then
		$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL20\n\n$LOCAL3"
		exit 1
	fi
fi

# check dependency
apt install -s ./$DEBFILE >> $TEMPDIR/debdeps
CHECKINST=`cat debdeps | grep Inst`
CHECKCONF=`cat debdeps | grep Conf`
if [ "$CHECKINST" = "" ] && [ "$CECKCONF" = "" ]; then
	# if dependency is not satisfiable
	DEPDEB="1"
	GETDEPS=`cat debdeps | grep :`
else
	# if dependency lets you install deb
	DEPDEB="0"
	GETDEPS=`cat debdeps | grep -v Conf | grep -v Inst | grep -v Remv | tail -n2 | head -n1`
fi

# is the package installed?
#OLDDEBFILE=`dpkg-query -l | grep $DEBNAME`
OLDDEBFILE=`apt-cache policy $DEBNAME | head -n2 | tail -n1 | grep [0-9]`

# check is deb available in the repository
CHECKSERVERDEB=`apt-cache policy $DEBNAME | head -n3 | tail -n1 | grep [0-9]`
# check deb version in the repository
SERVERDEBVERAVAIL4=`apt-cache policy $DEBNAME | head -n3 | tail -n1 | grep [0-9] | cut -f4 -d " "`
SERVERDEBVERAVAIL5=`apt-cache policy $DEBNAME | head -n3 | tail -n1 | grep [0-9] | cut -f5 -d " "`
SERVERDEBVERAVAIL6=`apt-cache policy $DEBNAME | head -n3 | tail -n1 | grep [0-9] | cut -f6 -d " "`

if [ "$CHECKSERVERDEB" != "" ]; then
	if [ "$SERVERDEBVERAVAIL4" != "" ] && [ "$SERVERDEBVERAVAIL5" = "" ] && [ "$SERVERDEBVERAVAIL6" = "" ]; then
		CHECKSERVERDEBVERAVAIL="$SERVERDEBVERAVAIL4"
	elif [ "$SERVERDEBVERAVAIL4" = "" ] && [ "$SERVERDEBVERAVAIL5" != "" ] && [ "$SERVERDEBVERAVAIL6" = "" ]; then
		CHECKSERVERDEBVERAVAIL="$SERVERDEBVERAVAIL5"
	elif [ "$SERVERDEBVERAVAIL4" = "" ] && [ "$SERVERDEBVERAVAIL5" = "" ] && [ "$SERVERDEBVERAVAIL6" != "" ]; then
		CHECKSERVERDEBVERAVAIL="$SERVERDEBVERAVAIL6"
	fi
else
	CHECKSERVERDEBVERAVAIL="0"
fi

### if deb is already installed
if [ "$OLDDEBFILE" != "" ]; then
	# check the old deb version
	CHECKOLDDEBVER=`dpkg -s $DEBNAME | grep Version | cut -f2 -d " "`
	### compare local and installed debs versions
	# if versions are the same
	if [ $DEBVER = $CHECKOLDDEBVER ]; then
		if [ "$DEPDEB" = "1" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL6\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL31: $CHECKOLDDEBVER\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n\n$LOCAL7" $BUTTONREMOVE $BUTTONREINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 3 ]]; then
				# remove deb
				pkexec /usr/bin/debi-tool-exe remove
			elif [[ $ret -eq 4 ]]; then
				# reinstall deb
				pkexec /usr/bin/debi-tool-exe reinstall
			else
				exit 1
			fi
		elif [ "$DEPDEB" = "0" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL6\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL31: $CHECKOLDDEBVER\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$GETDEPS\n\n$LOCAL7" $BUTTONREMOVE $BUTTONREINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 3 ]]; then
				# remove deb
				pkexec /usr/bin/debi-tool-exe remove
			elif [[ $ret -eq 4 ]]; then
				# reinstall deb
				pkexec /usr/bin/debi-tool-exe reinstall
			else
				exit 1
			fi
		fi
	fi

	# if local version is in newer version than alredy installed
	if [ $CHECKOLDDEBVER \< $DEBVER ]; then
		if [ "$DEPDEB" = "1" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL11\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL31: $CHECKOLDDEBVER\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL32\n$GETDEPS\n\n$LOCAL3" $BUTTONEXIT
			exit 1
		elif [ "$DEPDEB" = "0" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL11\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL31: $CHECKOLDDEBVER\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL7" $BUTTONREMOVE $BUTTONINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 3 ]]; then
				# remove deb
				pkexec /usr/bin/debi-tool-exe remove
			elif [[ $ret -eq 0 ]]; then
				# install deb
				pkexec /usr/bin/debi-tool-exe inst
			else
				exit 1
			fi
		fi
	fi

	# if local version is in older version than alredy installed
	if [ $DEBVER \< $CHECKOLDDEBVER ]; then
		$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL14\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL31: $CHECKOLDDEBVER\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL7" $BUTTONREMOVE $BUTTONINSTALL $BUTTONEXIT
		ret=$?
		if [[ $ret -eq 3 ]]; then
			# remove deb
			pkexec /usr/bin/debi-tool-exe remove
		elif [[ $ret -eq 0 ]]; then
			# install deb
			pkexec /usr/bin/debi-tool-exe inst
		else
			exit 1
		fi
	fi
fi

### if deb is not installed yet
if [ "$OLDDEBFILE" = "" ]; then
	# if no deb candidate in repositories
	if [ "$CHECKSERVERDEB" = "" ]; then
		if [ "$DEPDEB" = "1" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL24\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25: \n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL32\n$GETDEPS\n\n$LOCAL3" $BUTTONEXIT
			exit 1
		elif [ "$DEPDEB" = "0" ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL24\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25: \n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL19" $BUTTONINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 0 ]]; then
				# install deb
				pkexec /usr/bin/debi-tool-exe inst
				# check is the package installed
				NEWDEBFILE=`dpkg -s $DEBNAME | grep Status`
				if [ "$NEWDEBFILE" != "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL21 \n\n$LOCAL3"
					exit 0
				elif [ "$NEWDEBFILE" = "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL22 \n\n$LOCAL3"
					exit 0
				fi
			else
				exit 1
			fi
		fi
	fi
	
	# if deb is available in repositories but not installed
	if [ "$CHECKSERVERDEB" != "" ]; then

		# if local version is the same as in the repository
		if [ $DEBVER = $CHECKSERVERDEBVERAVAIL ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL30\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25: $CHECKSERVERDEBVERAVAIL\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL7" $BUTTONINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 0 ]]; then
				# install local deb
				pkexec /usr/bin/debi-tool-exe inst
			#elif [[ $ret -eq 5 ]]; then
			#	# install repo's deb
			#	pkexec /usr/bin/debi-tool-exe repoinst
				# check is the package installed
				NEWDEBFILE=`dpkg -s $DEBNAME | grep Status`
				if [ "$NEWDEBFILE" != "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL21 \n\n$LOCAL3"
					exit 0
				elif [ "$NEWDEBFILE" = "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL22 \n\n$LOCAL3"
					exit 0
				fi
			else
				exit 1
			fi
		fi
		# if local version is in older version than in the repository
		if [ $DEBVER \< $CHECKSERVERDEBVERAVAIL ]; then
			$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL26\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25: $CHECKSERVERDEBVERAVAIL\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL7" $BUTTONINSTALL $BUTTONEXIT
			ret=$?
			if [[ $ret -eq 0 ]]; then
				# install local deb
				pkexec /usr/bin/debi-tool-exe inst
			#elif [[ $ret -eq 5 ]]; then
			#	# install repo's deb
			#	pkexec /usr/bin/debi-tool-exe repoinst
				# check is the package installed
				NEWDEBFILE=`dpkg -s $DEBNAME | grep Status`
				if [ "$NEWDEBFILE" != "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL21 \n\n$LOCAL3"
					exit 0
				elif [ "$NEWDEBFILE" = "" ]; then
					$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL22 \n\n$LOCAL3"
					exit 0
				fi
			else
				exit 1
			fi
		fi
		# if local version is in never version than in the repository
		if [ $CHECKSERVERDEBVERAVAIL \< $DEBVER ]; then
			if [ "$DEPDEB" = "1" ]; then
				$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL29\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25: $CHECKSERVERDEBVERAVAIL\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL32\n$GETDEPS\n\n$LOCAL3" $BUTTONEXIT
				exit 1
			elif [ "$DEPDEB" = "0" ]; then
				$DIALOG $TITLE"$TITLETEXT" $TEXT"$LOCAL29\n\n$LOCAL15: $DEBNAME\n$LOCAL16: $DEBVER\n$LOCAL25:  $CHECKSERVERDEBVERAVAIL\n$LOCAL17: $DEBARCH\n$LOCAL18: $DEBSIZE\n\n$LOCAL33\n$LOCAL34\n$GETDEPS\n\n$LOCAL7" $BUTTONINSTALL $BUTTONEXIT
				ret=$?
				if [[ $ret -eq 0 ]]; then
					# install local deb
					pkexec /usr/bin/debi-tool-exe inst
					#elif [[ $ret -eq 5 ]]; then
					#	# install repo's deb
					#	pkexec /usr/bin/debi-tool-exe repoinst
					# check is the package installed
					NEWDEBFILE=`dpkg -s $DEBNAME | grep Status`
					if [ "$NEWDEBFILE" != "" ]; then
						$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL21 \n\n$LOCAL3"
						exit 0
					elif [ "$NEWDEBFILE" = "" ]; then
						$DIALOG $TITLE"$TITLETEXT" $MSGBOX $TEXT"$LOCAL22 \n\n$LOCAL3"
						exit 0
					fi
				else
					exit 1
				fi
			fi
		fi
	fi
	
fi

rm -rf $TEMPDIR

exit 0
