#!/usr/bin/env bash

# Cleanup
set -e
trap 'exit 1' SIGINT

# Source library
LIBDIR="/usr/share/file-scripts/"

for f in "$LIBDIR"/*.sh; do
	source "${f}"
done

BOOT_DIR='/boot'
ETC_DIR='/etc'

# Helper functions
function help() {
	cat <<HELPMESSAGE
$(basename "$0") $MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION

Usage: $(basename "$0") [-h|--help] [options] [patterns]

Options
  -h, --help            show this help message and exit
  -b, --boot            edit a file in /boot
  -d DIR, --dir DIR     edit a file in a given directory
  -E, --etc             edit a file in /etc
  -I, --no-ignore       do not respect .(git|fd)ignore files
  -i, --no-ignore-vcs   do not respect .gitignore files

Note that this script uses EDITOR to select an editor
HELPMESSAGE
}

while true; do
	case "${1}" in
	'-b' | '--boot')
		EDIT_BOOT=1
		shift
		continue
		;;
	'-d' | '--dir')
		DIR="${2}"
		case "${DIR}" in
		"")
			exit 1
			;;
		-*)
			exit 1
			;;
		esac
		shift 2
		continue
		;;
	--dir=*)
		DIR="${1#*=}"
		case "${DIR}" in
		"")
			exit 1
			;;
		-*)
			exit 1
			;;
		esac
		shift
		continue
		;;
	'-E' | '--etc')
		EDIT_ETC=1
		shift
		continue
		;;
	'-i' | '--no-ignore-vcs')
		NO_IGNORE_VCS=1
		shift
		continue
		;;
	'-I' | '--no-ignore')
		NO_IGNORE=1
		shift
		continue
		;;
	'-h' | '--help')
		help
		exit
		;;
	--)
		shift
		break
		;;
	-*)
		printf '%s\n' "Unknown option: ${1}" >&2
		exit 1
		;;
	*)
		break
		;;
	esac
done

# Handle -b and -E, they are mutually exclusive
if [[ -n $EDIT_BOOT && -z $EDIT_ETC ]]; then
	DIR="$BOOT_DIR"
elif [[ -z $EDIT_BOOT && -n $EDIT_ETC ]]; then
	DIR="$ETC_DIR"
elif [[ -n $EDIT_BOOT && -n $EDIT_ETC ]]; then
	printf '%s\n' 'Select either --boot or --etc, not both'
	exit 1
elif [[ -z $DIR ]]; then
	DIR='.'
fi

# Handle extra options
declare -a extra_opts

if [[ -n $NO_IGNORE ]]; then
	extra_opts+=('--no-ignore')
elif [[ -n $NO_IGNORE_VCS ]]; then
	extra_opts+=('--no-ignore-vcs')
fi

files="$(find_files $DIR "${extra_opts[@]}")"
selected_file="$(fzf --select-1 --exit-0 <<< "$files")"

if [[ -w "${selected_file}" ]]; then
	"$EDITOR" "$selected_file"
else
	sudo --edit "$selected_file"
fi