#!/bin/bash
## quickdel - delete any file matching a query
## Dependencies:
## * bash
## * fd

printHelp() {
cat << EOF
Fuzzy find and delete files matching patterns

Usage: quickdel [-h] [-i] [-I] [patterns]

Options:
    -d, --directories-only  only delete directories
    -h, --help              print this help page
    -i, --no-ignore         do not ignore .gitignore and .fdignore
    -I, --no--ignore-vcs    do not ignore .gitignore
EOF
}

# Pre-run correctness checks
unset files
unset fd_opts
ans=

declare -a files
declare -a fd_opts
declare -r blue='\033[0;34m'
declare -r nocolor='\033[0;0m'

[[ ! -x '/usr/bin/fd' ]] && echo 'fd is not present, cancelling' >&2 && exit 1

while true; do
    case "${1}" in
        '-d'|'--directories-only')
            fd_opts+=('--type' 'd')
            shift
            continue
            ;;
        '-h'|'--help')
            printHelp
            exit
            ;;
        '-i'|'--no-ignore')
            fd_opts+=('--no-ignore')
            shift
            continue
            ;;
        '-I'|'--no-ignore-vcs')
            fd_opts+=('--no-ignore-vcs')
            shift
            continue
            ;;
        --)
            shift
            break
            ;;
        -*)
            printf '%s\n' "Unknown option: ${1}" >&2
            exit 1
            ;;
        *)
            break
            ;;
    esac
done

# Prevent fd from selecting everything
[[ -z "${@}" ]] && printf '%s\n' "No queries entered, cancelling" >&2 && exit 1

for pattern in "${@}"; do
    while IFS= read -r -d '' file; do
        files+=("${file}")
    done < <(fd --hidden --print0 "${fd_opts[@]}" -- "${pattern}")
done

[[ -z "${files[*]}" ]] && printf '%s\n' "No results found" >&2 && exit 1

# List all filenames, pretty print them
for filename in "${files[@]}"; do
    if [[ -f "${filename}" ]]; then
        printf '%s\n' "${filename}" 
    elif [[ -d "${filename}" ]]; then
        printf '%b%s%b\n' "${blue}" "${filename}" "${nocolor}" 
    fi
done

printf '%s' "Would you like to delete these files? "
read -r -n 1 ans

if [[ "${ans:-n}" =~ (Y|y) ]]; then
    rm --recursive --force -- "${files[@]}"
else
    printf '\n%s\n' "Operation cancelled" >&2
    exit 1
fi