#!/bin/bash
# todo:
## x environment checks for webhook, xz-tools, and pishrink
### install if not found
## sanity checks in cleanup error trap to make sure nothing is wrongly deleted
## x ERR/TERMINATE traps
### x NO cleanup trap on EXIT
## x finish the pi query
## x add filename query

set -euo pipefail # fail on fuckups to iterate fasterrr :pope: strict fuk u mode :3

timestamp="$(date +%Y-%m-%d-%H%M-%Z)"
# disk=""
# log="${timestamp}_img_dump_testin.log"
# img_name="${timestamp}_Kali-Pi5-1TB-Working.img"

check_command() {
    if ! command -v "$1" >/dev/null 2>&1; then
        # output as error to stderr, and append to log only if defined
        echo "Required command '$1' not found. Install it and retry." >&2
        if [ -n "${log:-}" ]; then
            echo "Required command '$1' not found. Install it and retry." >>"$log"
        fi
        exit 1
    fi
}

# check da needed cmds~
for cmd in webhook xz pishrink sha256sum sudo lsblk dd; do
    check_command "$cmd"
done

# trap function cleanup
cleanup () {
    webhook "$0 errored! Cleaning up! seconds: $SECONDS line: $LINENO command: $BASH_COMMAND" true
    # supress errors if they not there
    # to save me from testing each one or writing a fun :poe:
    for file in "$img_name" "$img_name.sha256" "$img_name.xz" "$img_name.xz.sha256" "$log"; do
        if [ -f "$file" ]; then 
            echo "Deleting $file"
            sudo rm -f "$file" 2>/dev/null
        fi
    done
}

# cleanup any errant files on error/termination
## disable dis shit fo now
# trap cleanup ERR
# trap cleanup SIGINT
# trap cleanup SIGTERM

echo -e "\n\n\nSTARTING DUMP OPS\n\n\n"

# get disk
lsblk
read -p "Enter Disk Name (ex. sda, sdb no /dev or anything else) " disk_choice
if [ -z "${disk_choice:-}" ]; then
    echo "ERROR: No disk entered." >&2
    exit 1
fi
disk="/dev/$disk_choice"
if [ ! -e "$disk" ]; then
    echo "ERROR: $disk is not a device." >&2
    exit 1
fi

read -p "For Raspberry Pi? y\n default y" picheck
# set default to 'y' when empty
picheck=${picheck:-y}

# for when ask for tag
read -p "Input File Tag" filetag
# sanity check it
if [ -z "$filetag" ]; then
    echo "ERROR! File Tag is Empty!" >&2
    exit 1
fi

log="${timestamp}_${filetag}.log"
echo > "$log" # initialize to empty
img_name="${timestamp}_${filetag}.img"
clear

# logging optinos to log file
webhook "Selections! filetag: $filetag disk: $disk picheck: $picheck log: $log img_name: $img_name (Script Has Run $SECONDS Seconds Date $(date))" | tee -a "$log"

webhook "runnan raw dd img on $disk at to $img_name using 4M bs size (Script Has Run $SECONDS Seconds Date $(date))"
sudo dd if="$disk" of="$img_name" status=progress bs=4M 2>&1 | tee -a "$log"

webhook "Changing perms abd ownership on $img_name (Script has run $SECONDS seconds date $(date))"
sudo chown princesspi:princesspi "$img_name"
sudo chmod 660 "$img_name"

# fuckin nope rn
# webhook "generating sha256 checksum of $img_name (from $disk) to $img_name.sha256 (Script Has Run $SECONDS Seconds Date $(date))"
# sha256sum "$img_name" | tee -a "$img_name.sha256"

if [[ "$picheck" =~ [nN] ]]; then
    webhook "Doing non-pi xz compression on $img_name into $img_name.xz (Script Has Run $SECONDS Seconds Date $(date))"
    xz -v -k "$img_name" | tee -a "$log" # keeping for now so fiddle wit later
else
    # pishrink
    ## -v verbose
    ## -r use advanced filesystem repair option if the normal one fails
    ## -Z xz compression
    ## -a compress using multiple cores
    ## -n disable update check
    ## disavble upgrade check
    webhook "Doing pi compress using pishrink from $img_name ($disk) to $img_name.xz (Script Has Run $SECONDS Seconds Date $(date))"
    sudo pishrink -v -r -Z -a -n "$img_name" | tee -a "$log"
fi

# fuck yourself
# webhook "testing xz integrity: $img_name.xz (Script Has Run $SECONDS Seconds Date $(date))"
# xz -t -v "$img_name.xz" | tee -a "$log"
# webhook "xz integrity response code: $?"

msg="Generating sha256 checksums of $img_name.xz to $img_name.xz.sha256"
webhook "$msg"
echo "$msg" >>"$log"
webhook "testing xz integrity: $img_name.xz (Script Has Run $SECONDS Seconds Date $(date))"
sha256sum "$img_name.xz" > "$img_name.xz.sha256"

# do not fuckin deletee this shit till it works right
# if [ -f "$img_name" ]; then
# webhook "testing xz integrity: $img_name.xz (Script Has Run $SECONDS Seconds Date $(date))"
#     webhook "$img_name still there! Deleting by force!"
#     sudo rm -f "$img_name"
# fi

webhook "\n\n\nFUCKING FINAALLY ITS OVER\n\n\n\t$SECONDS Seconds Elapsed\n\tDateTime Started: $timestamp DateTime Finished: $(date +%Y-%m-%d-%H%M-%Z)"