#!/bin/bash

# shellcheck disable=SC2046,SC2140
llang=$(echo "$LANG" | awk -F\_ '{print $1}')

logdir=/var/log/tuxedo-upgrade
logfile=/var/log/tuxedo-upgrade/upgrade.log

# define and clear some variables and helper files
mkdir -p ${logdir}
echo "" > ${logfile}
echo 1 > /tmp/retval
echo 1 > /tmp/retval1
rm -f /tmp/checkroot
rm -f /tmp/rollback
echo 1 > /tmp/upstatus
echo 1 > /tmp/upstatus1
rm -f /etc/xdg/autostart/Upgrade.desktop 
rm -f /tmp/release
status=1
lo=""
wine=""
snap=""
dsnap=""
snapi=""
dsnapi=""

# check, if libreoffice is installed on system
if dpkg -l | grep -q libreoffice; then
    lo="libreoffice-kf5"
fi

if dpkg -l | grep -q tomte; then
    tomte="tuxedo-tomte"
fi

if dpkg -l | grep -q wine-stable; then
    wine="wine"
fi

if [ ! -f /usr/bin/snap ]; then
    snap="snapd-"
    dsnap="plasma-discover-backend-snap-"
else
    snapi="snapd+"
    dsnapi="plasma-discover-backend-snap+"
fi

# write a list of packages not installed from official repositorys, is wrong if user is not using tuxedo-mirrors
printf "### List is wrong, if the system is not using tuxedo-ubuntu-mirrors ###\n\n" > "$logdir"/installed-3rd-party-packages.txt
dpkg-query -W -f='${Package}\n' | sort -u | tee "$logdir"/paketliste_inst
for i in /var/lib/apt/lists/*Packages*; do
    if [[ "$i" != *tuxedo* ]]; then
        grep -h -P -o "^Package: \K.*" "$i"
    fi
done | sort -u | tee "$logdir"/paketliste_ppa
comm -12 "$logdir"/paketliste_inst "$logdir"/paketliste_ppa | while read -r package; do dpkg-query -W -f='${Package} ${Version}\n' "$package"; done | grep -Ev "tux|neon" | tee -a "$logdir"/installed-3rd-party-packages.txt


# set scaling to 1.0
export GDK_DPI_SCALE=1

# Get the screen width
screen_width=$(xrandr | awk '/ primary / {print $4}' | cut -d 'x' -f1)

#s set width of dialog windows to 45% of the screen width
width=$(( screen_width * 45 / 100 ))

# declare text variables
case "$llang" in
	de)
	    text_upgrade_before="Vor der Systemaktualisierung müssen wir sicher stellen, dass Ihr System aktuell ist. \n\nMöchten Sie ihr System nun aktualisieren?"
	    text_update1="Stelle sicher, dass das System aktuell ist."
	    text_update2="System aktualisiert."
	    text_upfail="Aktualisierung vor Systemupgrade fehlgeschlagen, beende nach Enter."
	    text_pk="Deaktiviere PackageKit."
	    text_tomte="Deaktiviere Tomte."
	    text_backup_repos="Sichere Repositories."
	    text_switch_repos="Schalte auf neue Repositories um und aktiviere apt-pinning."
	    text_distupgrade1="Aktualisiere und installiere notwendige Pakete der Basis 24.04. \nBrechen Sie diesen Vorgang nicht ab! \nDieser Prozess kann einige Zeit in Anspruch nehmen. \nBitte arbeiten Sie nicht in Ihrem System so lange die Aktualisierung läuft."
	    text_du_error="Die Aktualisierung der 24.04 Basis ist bei der Auffrischung der Quellen oder dem Herunterladen \nder neuen Pakete gescheitert. Alle Änderungen werden rückgängig gemacht.\n Sie können das Script jederzeit wieder ausführen.\n"
	    text_dryrun="Simuliere die Aktualisierung auf TUXEDO OS mit 24.04.1 Basis."
	    text_dryrun_error="Die simulierte Aktualisierung des Systems ist fehlgeschlagen. Mache alle Änderungen rückgängig."
	    text_rollback="Mache alle bisherigen Änderungen rückgängig. \nDas System wurde nicht auf die Basis 24.04 aktualisiert. \n"
	    text_root="Dieses Script benötigt root Rechte, bitte führen Sie es mit sudo aus."
	    text_weiter1="Das System ist auf dem aktuellen Stand. \nWollen Sie die Systemaktualisierung nun starten?"
	    text_weiter="<span size='large'>Das System ist für eine Systemaktualisierung bereit. Möchten Sie fortfahren? \nAlle eingerichteteten Repositories aus 3. Hand werden für die Aktualisierung deaktiviert </span>\n<span size='large' color='red'>Dieser Vorgang kann nicht abgebrochen werden.</span> <span size='large'>\n\nWollen Sie die Systemaktualisierung nun starten?</span>"
	    text_hold="Für Ihr System sind noch Aktualisierungen verfügbar. Für ein Release-Upgrade muss ihr System vollständig aktuell sein. \nBitte beheben Sie dieses Problem, bevor Sie fortfahren können."
	    text_cleanup="Räume auf."
	    log_rollback="Rollback auf Jammy nach Fehler"
	    log_upgrade="Fehler bei Jammy Upgrade"
	    log_net="Netzwerkverbindung verloren. Abbruch von apt-get."
	    log_dryrun="Fehler bei apt update dryrun"
	    log_dryrun_real="Dryrun fehlgeschlagen"
	    log_du_update="Fehler bei apt update noble"
	    log_du_dl="Fehler bei Download-only der Pakete"
	    log_du_install="Fehler bei Installation von apt aptitude"
	    log_du_upgrade="Fehler bei apt upgrade"
	    log_du_distupgrade="Fehler bei dist-upgrade"
	    log_du_packages1="Fehler bei install Pakete desktop"
	    log_du_packages2="Fehler install Paketliste"
	    log_zenity_1="Abbruch durch User"
	    log_zenity_2="Abbruch nach Upgrade"
	    log_simu="Fehler bei der Simulation des Upgrades, Anhalten des Skripts und Rückgängigmachen aller Änderungen auf dem System"
	    log_cancel_simu="Abbruch durch User nach Simulation"
	    log_error_u="Fehler beim Upgrade, Stoppen des Skripts und Rückgängigmachen aller Änderungen auf dem System"
	    log_error_du="Fehler bei der Aktualisierung"
	    log_error_pl="Fehler bei Paketliste"
	    title="TUXEDO OS System Aktualisierung"
	    ;;
	*)
	    export LANG=C.UTF-8
	    text_upgrade_before="Before the system upgrade, we need to make sure that your system is up to date. \n\nWould you like to upgrade your system now?"
	    text_update1="Make sure the system is up to date."
	    text_update2="System updated."
	    text_upfail="Update before system upgrade failed, exit after Enter."
	    text_pk="Deactivate PackageKit."
	    text_tomte="Deactivate Tomte."
	    text_backup_repos="Secure repositories"
	    text_switch_repos="Switch to new repositories and enable apt-pinning."
	    text_distupgrade1="Upgrade and install necessary packages of base 24.04. \nDo not cancel this process! \nThis process may take some time. \nPlease do not work in your system while the upgrade is running."
	    text_du_error="The upgrade of the 24.04 base failed when refreshing the sources or downloading new packages. All changes will be undone.\n You can run the script again at any time.\n"
	    text_dryrun="Simulate the upgrade to TUXEDO OS with 24.04.1 base."
	    text_dryrun_error="The simulated system update has failed. Undo all changes."
	    text_rollback="Undo all previous changes. \nThe system has not been upgraded to base 24.04. \n"
	    text_root="This script needs root rights, please start it with sudo."
	    text_weiter1="The system is up to date.\nDo you want to start the system update now?"
	    text_weiter="<span size='large'>The system is ready for a system update. Would you like to continue? \nAll installed 3rd party repositories will be deactivated for the update \n</span><span size='large' color='red'>This process cannot be cancelled.</span> <span size='large'>\n\nDo you want to start the system update now?</span>"
	    text_hold="Updates are still available for your system. Your system must be completely up-to-date for a release upgrade. \nPlease fix this problem before you can continue."
	    text_cleanup="Cleanup."
	    log_rollback="Rollback to Jammy after error"
	    log_upgrade="Error with Jammy Upgrade"
	    log_net="Network connection lost. Cancellation of apt-get."
	    log_dryrun="Error with apt update dryrun"
	    log_dryrun_real="Dryrun failed"
	    log_du_update="Fehler bei apt update noble"
	    log_du_dl="Error with download-only of packages"
	    log_du_install="Error during installation of apt aptitude"
	    log_du_upgrade="Error during apt upgrade"
	    log_du_distupgrade="Error during apt dist-upgrade"
	    log_du_packages1="Error during install packages desktop"
	    log_du_packages2="Error during install packagelist"
	    log_zenity_1="Cancellation by user"
	    log_zenity_2="Cancelled after upgrade"
	    log_simu="Error on simulation of the upgrade, stopping script and revert all changes on the system"
	    log_cancel_simu="Cancelled by user after simulation"
	    log_error_u="Error on upgrade, stopping script and revert all cahnges on the system"
	    log_error_du="Error during the update"
	    log_error_pl="Error with package list"
	    title="TUXEDO OS system upgrade"
	    ;;
esac

# check if the script was startet with root-rights
if [ "$EUID" -ne 0 ]
    then echo "$text_root"
    exit 1
fi

dpkg --purge tuxedo-webfai-nb-grub tuxedo-webfai-desktop-grub

rollback() {
    # we reset all changes to the initial status
    rm -f /etc/apt/sources.list.d/*.sources
    rm -f /etc/apt/preferences.d/*
    cp -af /etc/apt/backup/*.list /etc/apt/sources.list.d/
    cp -af /etc/apt/backup/sources.list.old /etc/apt/sources.list
    cp -af /etc/apt/backup/preferences/* /etc/apt/preferences.d/
    DEBIAN_FRONTEND=noninteractive apt-get update
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install tuxedo-tomte
    echo "systemctl unmask packagekit"
    systemctl unmask packagekit
    echo "$log_rollback"
}

start_log() {
    echo "--------------------------------------" >> "$logfile"
    echo "Starting update at: $(date)" >> "$logfile"
    echo "" >> "$logfile"
    echo "--------------------------------------" >> "$logfile"
    echo "" >> "$logfile"
}

stop_packagekit() {
    # make sure, packagekit doe not interupt our upgrade
    echo "$text_pk"
    echo "********************************"
    echo ""
    systemctl mask packagekit
    killall -9 DiscoverNotifier
}

stop_tomte() {
    # stop tomte, so that it can't interupt our upgrade
    echo "$text_tomte"
    echo "********************************"
    echo ""
    systemctl stop tuxedo-tomte.timer
    systemctl stop tuxedo-tomte.service
}

do_upgrade() {
    # 1st we make sure the system is on an actual upgrade state
    echo "$text_update1"
    echo "********************************"
    echo ""
    count=0
    max_attempts=3
    while ! DEBIAN_FRONTEND=noninteractive apt-get update; do
	((count++))
	if [ "$count" -ge "$max_attempts" ]; then
	    echo "$log_net" >> $logfile
	    echo "error" > /tmp/retval
	    echo 1 > /tmp/upstatus
	    echo "$log_upgrade"
	    exit 1
	fi
	sleep 1
    done
    echo 0 > /tmp/upstatus
    echo 0 > /tmp/retval
    if apt list --upgradable 2>/dev/null | grep -q tuxedo-release-upgrade; then
        echo " new version of tuxedo-release-upgrade avaiable"
        touch /tmp/release
    fi
    echo 0 > /tmp/upstatus
    echo 0 > /tmp/retval
    echo "DEBIAN_FRONTEND=noninteractive apt-get --assume-yes dist-upgrade im-config- hunspell-de-de- evdi-dkms- $snap $dsnap" 
    count=0
    max_attempts=3
    while ! DEBIAN_FRONTEND=noninteractive apt-get --assume-yes upgrade tuxedo-release-upgrade+ im-config- hunspell-de-de- evdi-dkms- "$snap" "$dsnap"; do
	((count++))
	if [ "$count" -ge "$max_attempts" ]; then
	    echo "$log_net" >> $logfile
	    echo 1 > /tmp/retval
	    echo 1 > /tmp/upstatus
	    echo "$log_upgrade"
	    exit 1
	fi
	sleep 1
    done
    if [ -f /tmp/release ]; then
    	exit 1
    fi
    if dpkg -l | grep plasma-desktop | grep -q 5.27; then
	mkdir -p /etc/apt/backup
	cp -af /etc/apt/sources.list.d/*.list /etc/apt/backup/
	sed -i 's/deb https:\/\/txos.tuxedo/#deb https:\/\/txos.tuxedo/' /etc/apt/sources.list.d/*.list
	sed -i 's/deb http:\/\/txos.tuxedo/#deb http:\/\/txos.tuxedo/' /etc/apt/sources.list.d/*.list
    fi
#    if LANG=C apt update 2>/dev/null | grep -q "upgradable"; then
#	echo error > /tmp/retval
#	echo 1 > /tmp/upstatus
#	zenity --warning --text "<span size='large'>$text_hold</span>" --title "$title" --width "$width" 2>/dev/null
#	exit 1
#    fi

    echo 0 > /tmp/upstatus
    echo 0 > /tmp/retval
}

backup_repos() {
    # we backup all user repos and user pinnings before we try to upgrade the system
    echo "$text_backup_repos"
    echo "********************************"
    echo ""
    mkdir -p /etc/apt/backup
    mkdir -p /etc/apt/backup/preferences
    mv /etc/apt/sources.list.d/*.list /etc/apt/backup/
    mv /etc/apt/sources.list /etc/apt/backup/sources.list.old
    mv /etc/apt/preferences.d/* /etc/apt/backup/preferences/
}

switch_repos() {
    echo "$text_switch_repos"
    echo "********************************"
    echo ""
    #tuxedo-os repository
    cp -af /usr/share/tuxedo-upgrade/*.sources /etc/apt/sources.list.d/
    cp -af /usr/share/tuxedo-upgrade/30-upgrade /etc/apt/preferences.d/
    if [ "$snap" ]; then
	cp -af /usr/share/tuxedo-upgrade/10-tuxedo-snap /etc/apt/preferences.d/
    fi
    if ! grep -q "force-overwrite" /etc/apt/apt.conf.d/*; then 
	cp /usr/share/tuxedo-upgrade/99-tuxedo-overwrite /etc/apt/apt.conf.d/
    fi
    cp /usr/share/tuxedo-upgrade/92-tuxedo-default-settings /etc/apt/apt.conf.d/
}
do_dryrun() {
    echo "$text_dryrun"
    echo "DEBIAN_FRONTEND=noninteractive apt-get update"
    echo "********************************"
    echo ""
    # check network connection state
    count=0
    max_attempts=3
    while ! DEBIAN_FRONTEND=noninteractive apt-get update; do
	((count++))
	if [ "$count" -ge "$max_attempts" ]; then
	    echo "$log_net" >> $logfile
	    echo "error" > /tmp/retval
	    echo 1 > /tmp/upstatus
	    echo "$log_dryrun"
	    exit 1
	fi
	sleep 1
    done
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
    # minimum package list representing a regular TUXEDO OS
    echo "DEBIAN_FRONTEND=noninteractive apt-get --dry-run --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade plasma-desktop+ tuxedoos-desktop+ poppler-utils+ libreoffice+ phonon4qt6+ fonts-liberation+ vlc+ libavcodec-extra+ hunspell-de-de- $snapi $dsnapi $snap $dsnap"
    echo ""
    # make a simulation of a full upgrade, to see, if there are any dependency problems
    if ! DEBIAN_FRONTEND=noninteractive apt-get --dry-run --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade plasma-desktop+ tuxedoos-desktop+ poppler-utils+ libreoffice+ phonon4qt6+ fonts-liberation+ vlc+ libavcodec-extra+ hunspell-de-de- "$snapi" "$dsnapi" "$snap" "$dsnap"; then
        echo "error" > /tmp/retval
	echo "$log_dryrun_real"
        echo 1 > /tmp/upstatus
        exit 1
    fi
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
}

do_distupgrade() {
    # we want new configs for all packages, which will get an upgrade from the new version (dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew")
    echo "$text_distupgrade1"
    echo "********************************"
    echo ""
    echo "DEBIAN_FRONTEND=noninteractive apt-get update"
    echo "--"
    # check network connection state
    count=0
    max_attempts=3
    while ! DEBIAN_FRONTEND=noninteractive apt-get update; do
	((count++))
	if [ "$count" -ge "$max_attempts" ]; then
	    echo "$log_net" >> $logfile
	    echo "error" > /tmp/retval
	    echo 1 > /tmp/upstatus
	    echo "$log_du_update"
	    touch /tmp/rollback
	    exit 1
	fi
	sleep 1
    done
    echo 0 > /tmp/upstatus
    echo 0 > /tmp/retval
    echo ""
    echo "DEBIAN_FRONTEND=noninteractive apt-get --download-only --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade plasma-desktop+ libjpeg-turbo8+ libjpeg-turbo8:i386+ libjpeg8+ tuxedoos-desktop+ libavcodec-extra+ inkscape-"
    echo "--"
    # make sure, all needed package are downloaded befor start upgrade process, prevents error on network loss during configuring of upgraded packages
    count=0
    max_attempts=10
    # try apt-get download 10 times
    while ! DEBIAN_FRONTEND=noninteractive apt-get --download-only --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade plasma-desktop+ libjpeg-turbo8+ libjpeg-turbo8:i386+ libjpeg8+ tuxedoos-desktop+ libavcodec-extra+ inkscape-; do
	((count++))
	if [ "$count" -ge "$max_attempts" ]; then
	    echo "$log_net"
	    echo "uerror" > /tmp/retval
	    echo 1 > /tmp/upstatus
	    echo "$log_du_dl"
	    touch /tmp/rollback
	    exit 1
	fi
	sleep 2
    done
    echo ""
    echo "DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes --no-install-recommends -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew"install apt aptitude apt-config-*"
    echo "--"
    DEBIAN_FRONTEND=noninteractive apt-get update
    # upgrading essentiell packages from new release (apt and aptitude) to make sure, we use the new versions on further upgrade process
    if ! DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes --no-install-recommends -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" install apt aptitude apt-config-* 2>&1; then
	echo "uerror" > /tmp/retval
	echo 1 > /tmp/upstatus
	echo "$log_du_install"
	exit 1
    fi
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
    echo ""
    echo "--"
    echo "DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade xdg-desktop-portal-lxqt- dolphin+ libavcodec-extra+"
    # now upgrade the remaining packages with dist-upgrade
    if ! DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" dist-upgrade xdg-desktop-portal-lxqt- dolphin+ libavcodec-extra+ 2>&1; then
	echo "uerror" > /tmp/retval
	echo 1 > /tmp/upstatus
	echo "$log_du_distupgrade"
	exit 1
    fi
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
    echo ""
    echo "DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" install tuxedo-theme-plasma tuxedoos-desktop vlc zenity im-config- xdg-desktop-portal-lxqt- hunspell-de-de-frami hunspell-de-de-"
    echo "--"
    # make sure, we have a functional desktop after upgrading, even if some packages from tuxedo os are not installed
    if ! DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes -o dpkg::options::="--force-confdef" -o dpkg::options::="--force-confnew" install tuxedo-theme-plasma tuxedoos-desktop vlc zenity im-config- xdg-desktop-portal-lxqt- hunspell-de-de-frami hunspell-de-de- 2>&1; then
	echo "uerror" > /tmp/retval
	echo 1 > /tmp/upstatus
	echo "$log_du_packages1"
	exit 1
    fi
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
    echo 0 > /tmp/upstatus1
    # auto purge obsolete packages
    echo "remove neon packages"
    DEBIAN_FRONTEND=noninteractive apt-get -y purge $(dpkg -l | grep  -E "\+neon|vrelease|release\+" | awk '{print $2}')
    # repair removed libs after purging the neon packages
    echo "reinstall all ~tux1 packages"
    if ! DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes install --reinstall $(dpkg -l | grep -E "~tux1|~tux2" | awk '{print $2}'| grep -vE "virtualbox|tuxedo") plasma-desktop tuxedoos-desktop language-selector-common "$wine" "$snap" "$dsnap" 2>&1; then
	echo "2nd try with packagelist"
	if ! DEBIAN_FRONTEND=noninteractive apt-get --assume-yes -o dpkg::options::="--force-confold" -o dpkg::options::="--force-confold" --reinstall install $(</usr/share/tuxedo/upgrader/packagelist.txt) plasma-desktop tuxedoos-desktop language-selector-common "$wine" "$snap" "$dsnap" 2>&1; then
	    echo "$log_du_packages2"
	    echo "error" > /tmp/retval1
	    echo 1 > /tmp/upstatus1
	    exit 1
	fi
    fi
    # create a list of automatic installed packages
    apt-mark showauto > /tmp/autolist
    echo 0 > /tmp/retval
    echo 0 > /tmp/upstatus
    echo 0 > /tmp/upstatus1
}

cleanup() {
    # we clean up our temprary changes
    echo "systemctl unmask packagekit"
    systemctl unmask packagekit
    apt-get update 
    dpkg --purge libappstream4
    # we remove packages, which should not exist in a noble system of tuxedo os
    DEBIAN_FRONTEND=noninteractive apt-get update
    echo "apt-get -y install apt-show-versions tuxedo-webfai-grub libneon27t64-gnutls libpgm-5.3-0t64 libieee1284-3t64"
    DEBIAN_FRONTEND=noninteractive apt-get -y install apt-show-versions tuxedo-webfai-grub libneon27t64-gnutls libpgm-5.3-0t64 libieee1284-3t64
    echo "apt-get --assume-yes purge $(apt-show-versions | awk '/No\ /{print $1}' | grep -v linux)"
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge $(apt-show-versions | awk '/No\ /{print $1}' | grep -v linux) neofetch tuxedo-neofetch+ skanlite+ kio-audiocd+
    DEBIAN_FRONTEND=noninteractive apt-get -y purge ~c
    DEBIAN_FRONTEND=noninteractive apt-mark auto $(</tmp/autolist)
    rm -f /etc/apt/preferences.d/3*-upgrade 
    rm -f /etc/apt/preferences.d/11-tuxedo-maliit 
    rm -f /etc/sddm.conf
    echo 0 > /tmp/retval
}

start_log
stop_packagekit >> ${logfile} 2>&1
stop_tomte >> ${logfile} 2>&1

xterm -geometry 200x20+0+0 -sl 20000 -e "tail -f ${logfile}" &

if ! zenity --question --text "<span size='large'>$text_upgrade_before</span>" --title "$title" --width "$width"; then
    echo ""  >> ${logfile} 2>&1
    echo "********************************"
    echo "$log_zenity_1"  >> ${logfile} 2>&1
    echo ""  >> ${logfile} 2>&1
    echo "abbruch" > /tmp/retval
    systemctl unmask packagekit
    exit 1
fi

(
    do_upgrade >> ${logfile} 2>&1
    echo "100"
) | 
zenity --progress --text "<span size='large'>$text_update1\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close 

if [ -f /tmp/release ]; then
    exit 0
fi

status=$(cat /tmp/upstatus)
if [ "$status" -eq 0 ]; then
    echo "$text_update2" | tee -a ${logfile} 
    echo "********************************" | tee -a ${logfile}
    echo "" | tee -a ${logfile}
else
    clear
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install tuxedo-tomte
    echo "$text_upfail"
    echo error > /tmp/retval
    systemctl unmask packagekit
    exit 1
fi

if ! zenity --question --text "<span size='large'>$text_weiter1</span>" --title "$title" --width "$width"; then
    echo "" | tee -a ${logfile}
    echo "********************************" | tee -a ${logfile}
    echo "$log_zenity_2" | tee -a ${logfile}
    echo "" | tee -a ${logfile}
    echo "abbruch" > /tmp/retval
    rm -f /etc/apt/preferences.d/*
    cp -af /etc/apt/backup/*.list /etc/apt/sources.list.d/ 2>/dev/null
    cp -af /etc/apt/backup/preferences/* /etc/apt/preferences.d/
    systemctl unmask packagekit >> ${logfile} 2>&1
    exit 1
fi

# remove tomte temporarily
echo "DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge tuxedo-tomte" >> "$logfile"
DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge tuxedo-tomte >> "$logfile"

# temporarily remove libreoffice wine-stable 32bit packages
echo "" >> "$logfile"
echo "remove libreoffice and some other packages we do not want in the system before upgrading" >> "$logfile"
echo "apt-get --assume-yes purge libreoffice ure signal* calibre* wine-stable mpv network-manager-openvpn-gnome proton-foo inkscape libcamera-tools telegram-desktop libturbojpeg0 libturbojpeg0-dev libjpeg-turbo8-dev libjpeg8-dev libjpeg-dev libjpeg-turbo-progs" >> "$logfile"
echo "--" >> "$logfile"
DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge $(dpkg -l | grep -E "4:24.8.0-1tux1|calibre|proton|telegram" | awk '{print $2}') signal-desktop wine-stable mpv network-manager-openvpn-gnome inkscape libcamera-tools libturbojpeg0 libturbojpeg0-dev libjpeg-turbo8-dev libjpeg8-dev libjpeg-dev libjpeg-turbo-progs >> "$logfile"
echo "" >> "$logfile"
echo "remove i386 packages" >> "$logfile"
echo "apt-get --allow-remove-essential --assume-yes purge $(dpkg -l | awk '/i386/{print $2}')" >> "$logfile"
echo "--" >> "$logfile"
DEBIAN_FRONTEND=noninteractive apt-get --allow-remove-essential --assume-yes purge $(dpkg -l | awk '/i386/{print $2}') --auto-remove >> "$logfile"
echo "DEBIAN_FRONTEND=noninteractive apt-get --assume-yes autopurge" >> $logfile
DEBIAN_FRONTEND=noninteractive apt-get --assume-yes autopurge
DEBIAN_FRONTEND=noninteractive apt-get --assume-yes clean

if dpkg -l | grep -q plasma-framework; then
    echo "removing plasma-framework" >> "$logfile"
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge plasma-framework >> "$logfile" 2>&1
fi

backup_repos >> ${logfile} 2>&1
switch_repos >> ${logfile} 2>&1

(
    do_dryrun >> ${logfile} 2>&1 
    echo "100"
) | 
zenity --progress --text "<span size='large'>$text_dryrun\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close 
status=$(cat /tmp/upstatus)
if [ "$status" -ne 0 ]; then
    echo "$log_simu" | tee -a ${logfile}
    echo error > /tmp/retval
    zenity --warning --text "<span size='large'>$text_dryrun_error</span>" --title "$title" --width "$width"
    (
	rollback  >> ${logfile} 2>&1
	echo "100"
    ) |
    zenity --progress --text "<span size='large'>$text_rollback\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close
    exit 1
fi

if ! zenity --question --text "$text_weiter" --title "$title" --width "$width"; then
    echo "" | tee -a ${logfile}
    echo "********************************" | tee -a ${logfile}
    echo "$log_cancel_simu" | tee -a ${logfile}
    echo "" | tee -a ${logfile}
    echo "abbruch" > /tmp/retval
    (
	rollback  >> ${logfile} 2>&1
	echo "100"
    ) |
    zenity --progress --text "<span size='large'>$text_rollback\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close
    exit 1
fi

(
    do_distupgrade >> ${logfile} 2>&1 
    echo "100"
) |
zenity --progress --text "<span size='large'>$text_distupgrade1\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close 
if [ -f /tmp/rollback ]; then
    echo "$log_error_u" | tee -a ${logfile}
    echo error > /tmp/retval
    zenity --warning --text "<span size='large'>$text_du_error</span>" --title "$title" --width "$width"
    (
	rollback  >> ${logfile} 2>&1
	echo "100"
    ) |
    zenity --progress --text "<span size='large'>$text_rollback\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close
    exit 1
fi

status=$(cat /tmp/upstatus)
status1=$(cat /tmp/upstatus1)

if [ "$status" -ne 0 ] && [ "$status1" -ne 0 ]; then
    echo "$log_error_du" | tee -a ${logfile}
    echo "uerror" > /tmp/retval
    exit 1
fi
if [ "$status" -eq 0 ] && [ "$status1" -ne 0 ]; then
    echo "$log_error_pl" >> ${logfile} 2>&1
    echo "perror" > /tmp/retval1
fi
if [ "$status" -eq 0 ] && [ "$status1" -eq 0 ]; then
    echo 0 > /tmp/retval
    rm -f /tmp/retval1
fi
(
    cleanup >> ${logfile} 2>&1 
    echo "100"
) |
zenity --progress --text "<span size='large'>$text_cleanup\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close 
# give user the chance to fix language and keyboard layout

(
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install zenity breeze-icon-theme spice-vdagent tuxedo-control-center "$tomte" >> ${logfile} 2>&1
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes install  --no-install-recommends tuxedo-base-files tuxedo-common-settings >> ${logfile} 2>&1
    DEBIAN_FRONTEND=noninteractive apt-get --allow-downgrades --assume-yes install --reinstall $(dpkg -l | grep -E "~tux1|~tux2" | awk '{print $2}'| grep -vE "virtualbox|tuxedo") plasma-desktop tuxedoos-desktop language-selector-common "$wine" "$snap" "$dsnap" >> ${logfile} 2>&1
    dpkg --purge tuxedo-release-upgrade  >> ${logfile} 2>&1
    DEBIAN_FRONTEND=noninteractive apt-get --assume-yes purge ~c  >> ${logfile} 2>&1
) |
zenity --progress --text "<span size='large'>$text_distupgrade1\n</span>" --title "$title" --pulsate --no-cancel --width "$width" --auto-close
konsole -e bash -c "dpkg-reconfigure locales && dpkg-reconfigure keyboard-configuration && exit"
