#!/bin/sh

# Vars {{{
readonly PROGNAME=$(basename "${0}")
readonly PROGDIR=$(readlink -m $(dirname "${0}"))
readonly ARGS="${*}"
readonly NBARGS="${#}"
[ -z "${DEBUG}" ] && DEBUG=0
## Export DEBUG for sub-script
export DEBUG

## Colors
readonly PURPLE='\033[1;35m'
readonly RED='\033[0;31m'
readonly RESET='\033[0m'
readonly COLOR_DEBUG="${PURPLE}"
# }}}
usage() {                                                       # {{{

	cat <<- EOF
usage: $PROGNAME [--debug,--help] [--git,--package,--venv]

Try to launch the most appropriate qutebrowser binary :
  1. From venv
  2. From APT package
  3. From Git repository

EXAMPLES :
    - Launch qutebrowser
        ${PROGNAME}

OPTIONS :
    -d,--debug
        Enable debug messages.

    --git
        Force to use QuteBrowser from Git repository.

    --help
        Print this help message.

    --package
        Force to use QuteBrowser from package.

    --venv
        Force to use QuteBrowser from Python Virtual ENVironment.

EOF

}
# }}}
define_vars() {                                                 # {{{

	## Use Qutebrowser from Python Virtual Environment by default
	QB_VENV_MODE="0"

	## Qutebrowser possibles paths
	QB_VENV_PYTHON_PATH="${HOME}/src/qutebrowser-venv/bin/python3"
	QB_GIT_REPOSITORY="${HOME}/repos/qutebrowser"

}
# }}}
debug_message() {                                               # {{{

	local_debug_message="${1}"

	## Print message if DEBUG is enable (=0)
	[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_debug_message}"

	return 0
}
# }}}
error_message() {                                               # {{{

	local_error_message="${1}"
	local_error_code="${2}"

	## Print message if DEBUG is enable (=0)
	[ "${DEBUG}" -eq "0" ] && printf '%b\n' "ERROR − ${PROGNAME} : ${RED}${local_error_message}${RESET}"

	exit "${local_error_code:=66}"
}
# }}}
get_qutebrowser_bin() {                                         # {{{

	return_get_qutebrowser_bin="1"

	## First try venv {{{
	if [ "${QB_VENV_MODE}" -eq "0" ] && [ -f "${QB_VENV_PYTHON_PATH}" ]; then
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}venv${COLOR_DEBUG} can be used."
		QUTEBROWSER_BIN="${QB_VENV_PYTHON_PATH} -m qutebrowser"
		return_get_qutebrowser_bin="0"
		### Be sure to skip other MODE if not already defined
		[ -z "${QB_PACKAGE_MODE}" ] && QB_PACKAGE_MODE="1"
		[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="1"
	else
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}venv${COLOR_DEBUG} not selected or can't be used."
		### Be sure to test package MODE
		QB_PACKAGE_MODE="0"
	fi
	## }}}

	## Then try package {{{
	if [ "${QB_PACKAGE_MODE}" -eq "0" ] && dpkg -l | grep -q qutebrowser ; then
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}package${COLOR_DEBUG} will be used."
		QUTEBROWSER_BIN="$(command qutebrowser)"
		return_get_qutebrowser_bin="0"
		### Be sure to skip other MODE if not already defined
		[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="1"
	else
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}package${COLOR_DEBUG} not selected or can't be used."
		### Allow to try last MODE if not already defined
		[ -z "${QB_GIT_MODE}" ] && QB_GIT_MODE="0"
	fi
	## }}}

	## Finally, try git repository {{{
	if [ "${QB_GIT_MODE}" -eq "0" ] && [ -f "${QB_GIT_REPOSITORY}/qutebrowser.py" ]; then
		QUTEBROWSER_BIN="${QB_GIT_REPOSITORY}/qutebrowser.py --backend webengine"
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}Git repository${COLOR_DEBUG} will finally be used."
		return_get_qutebrowser_bin="0"
	else
		debug_message "get_qutebrowser_bin − \
Qutebrowser from ${RED}git repository${COLOR_DEBUG} not selected or can't be used."
	fi
	## }}}

	return "${return_get_qutebrowser_bin}"

}
# }}}
main() {                                                        # {{{

	## Define all vars
	define_vars

	## Try to get a working qutebrowser binary
	### Or exit with error message and code 1
	get_qutebrowser_bin \
		|| error_message "Can't find a working qutebrowser binary." "1"

	## Open Qutebrowser (with arguments)
	### And exit
	sh -c "${QUTEBROWSER_BIN} ${ARGS}" \
		exit 0

}
# }}}

# Manage arguments                                                # {{{

## If there is argument(s)
if [ ! "${NBARGS}" -eq "0" ]; then

	manage_arg="0"

	# Parse all options (start with a "-") one by one
	while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do

	case "${1}" in
		-d|--debug )           ## Enable debug mode
			## Enable DEBUG
			DEBUG="0"
			;;
		--git )                ## Use Git repo
			QB_GIT_MODE="0"
			;;
		-h|--help )            ## help
			usage
			## Exit after help informations
			exit 0
			;;
		--package )            ## Use package
			QB_PACKAGE_MODE="0"
			;;
		--venv )               ## Use Python venv
			QB_VENV_MODE="0"
			;;
		* )                    ## unknow option
			printf '%b\n' "${RED}Invalid option: ${1}${RESET}"
			printf '%b\n' "---"
			usage
			exit 1
			;;
	esac

	debug_message "Arguments management − \
${RED}${1}${COLOR_DEBUG} option managed."

	## Move to the next argument
	shift
	manage_arg=$((manage_arg+1))

	done

	debug_message "Arguments management − \
${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed."
else
	debug_message "Arguments management − \
No arguments/options to manage."
fi

# }}}

main

exit 255