#!/bin/bash
# shutdown-timer.sh
# Dieses Skript ermöglicht das Herunterfahren des Systems nach einer benutzerdefinierten Zeit.
# Es bietet einen Abbruch-Button, um den Countdown zu stoppen.

# Passwortabfrage mittels Zenity
PASS=$(zenity --password --title="Sudo Passwort eingeben" --text="Bitte gib Dein Sudo-Passwort ein:")

# Falls kein Passwort eingegeben wurde, abbrechen.
if [ -z "$PASS" ]; then
    zenity --error --text="Es wurde kein Passwort eingegeben. Das Skript wird beendet."
    exit 1
fi

# Funktion zum Ausführen von Befehlen mit sudo unter Verwendung des eingegebenen Passworts
run_sudo() {
    echo "$PASS" | sudo -S "$@"
}

# Überprüfe, ob das angegebene Passwort korrekt ist
if ! echo "$PASS" | sudo -S -v &>/dev/null; then
    zenity --error --text="Falsches Sudo-Passwort. Das Skript wird beendet."
    exit 1
fi

# Formular zur Eingabe der Zeit bis zum Shutdown (Stunden, Minuten, Sekunden)
FORM_RESULT=$(zenity --forms --title="Shutdown Timer" --text="Gib die Zeit bis zum Shutdown an:" \
                --add-entry="Stunden" --add-entry="Minuten" --add-entry="Sekunden")

# Falls das Formular abgebrochen wurde, beenden.
if [ -z "$FORM_RESULT" ]; then
    exit 0
fi

# Die Felder werden durch "|" getrennt.
IFS="|"
read HOURS MINUTES SECONDS <<< "$FORM_RESULT"
unset IFS

# Leere Eingaben werden als 0 gewertet.
HOURS=${HOURS:-0}
MINUTES=${MINUTES:-0}
SECONDS=${SECONDS:-0}

# Überprüfen, ob die Eingaben ausschließlich Zahlen enthalten
if ! [[ "$HOURS" =~ ^[0-9]+$ && "$MINUTES" =~ ^[0-9]+$ && "$SECONDS" =~ ^[0-9]+$ ]]; then
    zenity --error --text="Bitte gib in allen Feldern nur Zahlen ein."
    exit 1
fi

# Gesamtdauer in Sekunden berechnen
TOTAL_SECONDS=$(( HOURS * 3600 + MINUTES * 60 + SECONDS ))

# Falls die Gesamtdauer 0 Sekunden beträgt, wird das Skript beendet.
if [ "$TOTAL_SECONDS" -le 0 ]; then
    zenity --error --text="Die eingegebene Zeit muss größer als 0 sein."
    exit 1
fi

# Info-Fenster: Zeige an, wann der Shutdown erfolgen soll.
zenity --info --title="Shutdown Timer" --width=400 \
       --text="Das System wird in $HOURS Stunde(n), $MINUTES Minute(n) und $SECONDS Sekunde(n) heruntergefahren."

# Countdown starten und in einem Zenity-Progress-Fenster mit Abbruch-Möglichkeit anzeigen.
(
    for (( remaining=TOTAL_SECONDS; remaining>=0; remaining-- )); do
        percent=$(( 100 * (TOTAL_SECONDS - remaining) / TOTAL_SECONDS ))
        hrs=$(( remaining / 3600 ))
        mins=$(( (remaining % 3600) / 60 ))
        secs=$(( remaining % 60 ))
        time_str=$(printf "%02d:%02d:%02d" "$hrs" "$mins" "$secs")
        echo "$percent"
        echo "# Verbleibende Zeit: $time_str"
        sleep 1
    done
) | zenity --progress --title="Shutdown Countdown" \
           --text="Countdown läuft..." \
           --percentage=0 \
           --auto-close \
           --cancel-label="Abbrechen"

# Prüfen, ob der Benutzer den Countdown abgebrochen hat
if [ $? -ne 0 ]; then
    zenity --info --text="Der Shutdown wurde abgebrochen."
    exit 0
fi

# Wenn der Countdown normal endet, fährt der Rechner automatisch herunter.
run_sudo shutdown -h now

