#!/bin/sh
# Copyright 2007 Jari Aalto;
# Copyright 2019-2022 Bastien Roucariès
# Copyright 2022 Richard Lewis
# Released under GNU GPL v2 or any later version
PATH="$PATH:/usr/share/sensible-utils/bin"

program="$(realpath "$(command -v "$0")")"

Try()
{
    $candidate "$@"
    ret=$?
    [ "$ret" -ne 126 ] && [ "$ret" -ne 127 ] && exit "$ret"
}

TryEnv()
{
    # global $candidate
    [ -z "$candidate" ] && return
    # Prevent recursive loops, where environment variables are set to this script
    [ x$(realpath "$(command -v "$candidate" || true)" || true) = x"$program" ] && return
    # interpret like environ (7) man page. Do not use eval in order to not leak variables
    sh -c "$candidate \"\$@\"" EDITOR "$@"
    ret=$?
    # Operating system command not found
    [ "$ret" -ne 126 ] && [ "$ret" -ne 127 ] && exit "$ret"
}


# work around for #991982
nano ()
{
    if [ -z "$TERM" ]; then
	return 126
    else
	command nano "$@"
    fi
}

for candidate in "$VISUAL" "$EDITOR" "$SENSIBLE_EDITOR" "$SELECTED_EDITOR"; do
    TryEnv "$@"
done

# fix #987675
if [ -n "$HOME" ]; then
    if [ -r ~/.selected_editor ]; then
	. ~/.selected_editor 2>/dev/null
    elif [ -z "$EDITOR" ] && [ -z "$SELECTED_EDITOR" ] && [ -t 0 ]; then
	select-editor && . ~/.selected_editor 2>/dev/null
    fi
fi

for candidate in "$EDITOR" "$SELECTED_EDITOR"; do
    TryEnv "$@"
done

for candidate in editor nano nano-tiny vi; do
    Try "$@"
done

echo "Couldn't find an editor!" 1>&2
echo 'Set the $EDITOR environment variable to your desired editor.' 1>&2
exit 1

