#!/usr/bin/env bash

set -o nounset
set -o pipefail

BACKUP_DIR="$HOME/Backups"
mkdir -p "$BACKUP_DIR"

walk() {
    local dir="$1"

    for entry in "$dir"/* "$dir"/.*; do
        # skip non-existent globs
        [[ -e "$entry" ]] || continue

        # skip . and ..
        [[ "$(basename "$entry")" == "." || "$(basename "$entry")" == ".." ]] && continue

        # skip ~/.local and ~/.cache entirely
        case "$entry" in
            "$HOME/.local"|"$HOME/.cache") continue ;;
        esac

        if [[ -d "$entry" && ! -L "$entry" ]]; then
            walk "$entry"
        elif [[ -f "$entry" ]]; then
            # delete zero-byte files
            if [[ ! -s "$entry" ]]; then
                rm -f -- "$entry"
                continue
            fi

            # move .bak files
            if [[ "$entry" == *.bak ]]; then
                mv -n -- "$entry" "$BACKUP_DIR/"
            fi
        fi
    done
}

walk "$HOME"
