#!/bin/bash
# Author: CryoByte33
# I am in no way responsible to damage done to any device this
# is executed on, all liability lies with the runner.

hasPass=$(passwd -S "$USER" | awk -F " " '{print $2}')
if [[ ! $hasPass == "P" ]]; then
    zenity --error --title="Password Error" --text="Password is not set, please set one in the terminal with the <b>passwd</b> command, then run this again." --width=400 2> /dev/null
else
    PASSWD="$(zenity --password --title="Enter Password" --text="Enter Deck User Password (not Steam account!)" 2>/dev/null)"
    echo "$PASSWD" | sudo -v -S
    ans=$?
    if [[ $ans == 1 ]]; then
        zenity --error --title="Password Error" --text="Incorrect password provided, please run this command again and provide the correct password." --width=400 2> /dev/null
    else
        if zenity --question --title="Disclaimer" --text="This script was made by CryoByte33 to resize the swapfile on a Steam Deck.\n\n<b>Disclaimer: I am in no way responsible to damage done to any device this is executed on, all liability lies with the runner.</b>\n\nDo you accept these terms?" --width=600 2> /dev/null; then
            CURRENT_SWAP_SIZE=$(ls -l /home/swapfile | awk '{print $5}')
            CURRENT_VM_SWAPPINESS=$(sysctl vm.swappiness | awk '{print $3}')
            if zenity --question --title="Change Swap Size?" --text="Do you want to change the swap file size?" --width=300 2> /dev/null; then
                AVAILABLE=$(df --output="avail" -lh --sync /home | grep -v "Avail" | sed -e 's/^[ \t]*//')
                MACHINE_AVAILABLE=$(( $(df --output="avail" -l --sync /home | grep -v "Avail" | sed -e 's/^[ \t]*//') * 1024 ))
                SIZE=$(zenity --list --radiolist --text "You have $AVAILABLE space available, what size would you like the swap file (in GB)?" --hide-header --column "Selected" --column "Size" TRUE "1" FALSE "2" FALSE "4" FALSE "8" FALSE "12" FALSE "16" FALSE "32" --height=400 2> /dev/null)
                MACHINE_SIZE=$(( $SIZE * 1024 * 1024 ))
                TOTAL_AVAILABLE=$(( $MACHINE_AVAILABLE + $CURRENT_SWAP_SIZE ))
                echo "Debugging Information:"
                echo "----------------------"
                echo "Bytes Available: $MACHINE_AVAILABLE"
                echo "Chosen Size: $MACHINE_SIZE"
                echo "Current Swap Size in Bytes: $CURRENT_SWAP_SIZE"
                echo "Total Size Available: $TOTAL_AVAILABLE"

                if [ "$MACHINE_SIZE" -lt $TOTAL_AVAILABLE ]; then
                    (
                        echo 0
                        echo "# Disabling swap..."
                        sudo swapoff -a
                        echo 25
                        echo "# Creating new $SIZE GB swapfile (be patient, this can take between 10 seconds and 30 minutes)..."
                        sudo dd if=/dev/zero of=/home/swapfile bs=1G count=$SIZE status=none
                        echo 50
                        echo "# Setting permissions on swapfile..."
                        sudo chmod 0600 /home/swapfile
                        echo 75
                        echo "# Initializing new swapfile..."
                        sudo mkswap /home/swapfile 
                        sudo swapon /home/swapfile
                        echo 100
                        echo "# Process completed! You can verify the file is resized by doing 'ls -lash /home/swapfile' or using 'swapon -s'."
                    ) | zenity --title "Resizing Swap File" --progress --no-cancel --width=800 2> /dev/null
                else
                    zenity --error --title="Invalid Size" --text="You selected a size greater than the space you have available, cannot proceed." --width=500 2> /dev/null
                fi
            fi
            # Thank you to protosam for the idea and some of the code here.
            if zenity --question --title="Change Swappiness?" --text="Would you like to change swappiness?\n\nCurrent value: $CURRENT_VM_SWAPPINESS\nRecommended: 1" --width=300 2> /dev/null; then
                SWAPPINESS_ANSWER=$(zenity --list --title "Swappiness Value" --text "What value would you like to use for swappiness?" --column="vm.swappiness" "100" "50" "30" "1" --width=100 --height=300 2> /dev/null)
                sudo sysctl -w "vm.swappiness=$SWAPPINESS_ANSWER"
                if [ "$SWAPPINESS_ANSWER" -eq "100" ]; then
                    sudo rm /etc/sysctl.d/zzz-custom-swappiness.conf
                else
                    echo "vm.swappiness=$SWAPPINESS_ANSWER" | sudo tee /etc/sysctl.d/zzz-custom-swappiness.conf
                fi
            fi
        else
            zenity --error --title="Terms Denied" --text="Terms were denied, cannot proceed." --width=300 2> /dev/null
        fi
    fi
fi