# shellcheck shell=bash
# shellcheck disable=SC2120,SC2207
# A future refactor can fix this better.

# tmux completion
# See: http://www.debian-administration.org/articles/317 for how to write more.
# Usage: Put "source bash_completion_tmux.sh" into your .bashrc

_tmux_expand() {
	[[ "$cur" != "${cur%\\}" ]] && cur="$cur\\"
	if [[ "$cur" == \~*/* ]]; then
		eval "cur=$cur"
	else
		if [[ "$cur" == \~* ]]; then
			cur=${cur#\~}
			COMPREPLY=($(compgen -P '~' -u "$cur"))
			return ${#COMPREPLY[@]}
		fi
	fi
}

_tmux_filedir() {
	local IFS='
'
	_tmux_expand || return 0
	if [[ "$1" = -d ]]; then
		COMPREPLY=("${COMPREPLY[@]}" $(compgen -d -- "$cur"))
		return 0
	fi
	COMPREPLY=("${COMPREPLY[@]}" $(eval "compgen -f -- \"$cur\""))
}

function _tmux_complete_client() {
	local IFS=$'\n'
	local cur="${1}"
	COMPREPLY+=($(compgen -W "$(tmux -q list-clients 2> /dev/null | cut -f 1 -d ':')" -- "${cur}"))
}
function _tmux_complete_session() {
	local IFS=$'\n'
	local cur="${1}"
	COMPREPLY+=($(compgen -W "$(tmux -q list-sessions 2> /dev/null | cut -f 1 -d ':')" -- "${cur}"))
}
function _tmux_complete_window() {
	local IFS=$'\n'
	local cur="${1}"
	local session_name sessions
	session_name="$(echo "${cur}" | sed 's/\\//g' | cut -d ':' -f 1)"

	sessions="$(tmux -q list-sessions 2> /dev/null | sed -re 's/([^:]+:).*$/\1/')"
	if [[ -n "${session_name}" ]]; then
		sessions="${sessions}
        $(tmux -q list-windows -t "${session_name}" 2> /dev/null | sed -re 's/^([^:]+):.*$/'"${session_name}"':\1/')"
	fi
	cur=${cur/:/\\\\:}
	sessions=${sessions/:/\\\\:}
	COMPREPLY+=($(compgen -W "${sessions}" -- "${cur}"))
}

_tmux() {
	local cur prev
	local i cmd cmd_index option option_index
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD - 1]}"

	if [[ "${prev}" == -f ]]; then
		_tmux_filedir
	else
		# Search for the command
		local skip_next=0
		for ((i = 1; i <= COMP_CWORD; i++)); do
			if [[ ${skip_next} -eq 1 ]]; then
				#echo "Skipping"
				skip_next=0
			elif [[ ${COMP_WORDS[i]} != -* ]]; then
				cmd="${COMP_WORDS[i]}"
				cmd_index=${i}
				break
			elif [[ ${COMP_WORDS[i]} == -f ]]; then
				skip_next=1
			fi
		done

		# Search for the last option command
		skip_next=0
		for ((i = 1; i <= COMP_CWORD; i++)); do
			if [[ ${skip_next} -eq 1 ]]; then
				#echo "Skipping"
				skip_next=0
			elif [[ ${COMP_WORDS[i]} == -* ]]; then
				option="${COMP_WORDS[i]}"
				option_index=${i}
				if [[ ${COMP_WORDS[i]} == -- ]]; then
					break
				fi
			elif [[ ${COMP_WORDS[i]} == -f ]]; then
				skip_next=1
			fi
		done

		if [[ $COMP_CWORD -le $cmd_index ]]; then
			# The user has not specified a command yet
			COMPREPLY=("${COMPREPLY[@]:-}" $(compgen -W "$(tmux start-server \; list-commands | cut -d' ' -f1)" -- "${cur}"))
		else
			case ${cmd} in
				attach-session | attach)
					case "$prev" in
						-t) _tmux_complete_session "${cur}" ;;
						*) options="-t -d" ;;
					esac
					;;
				detach-client | detach)
					case "$prev" in
						-t) _tmux_complete_client "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				lock-client | lockc)
					case "$prev" in
						-t) _tmux_complete_client "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				lock-session | locks)
					case "$prev" in
						-t) _tmux_complete_session "${cur}" ;;
						*) options="-t -d" ;;
					esac
					;;
				new-session | new)
					case "$prev" in
						-t) _tmux_complete_session "${cur}" ;;
						-[n | d | s]) options="-d -n -s -t --" ;;
						*)
							if [[ ${COMP_WORDS[option_index]} == -- ]]; then
								_command_offset "${option_index}"
							else
								options="-d -n -s -t --"
							fi
							;;
					esac
					;;
				refresh-client | refresh)
					case "$prev" in
						-t) _tmux_complete_client "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				rename-session | rename)
					case "$prev" in
						-t) _tmux_complete_session "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				source-file | source) _tmux_filedir ;;
				has-session | has | kill-session)
					case "$prev" in
						-t) _tmux_complete_session "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				suspend-client | suspendc)
					case "$prev" in
						-t) _tmux_complete_client "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
				switch-client | switchc)
					case "$prev" in
						-c) _tmux_complete_client "${cur}" ;;
						-t) _tmux_complete_session "${cur}" ;;
						*) options="-l -n -p -c -t" ;;
					esac
					;;

				send-keys | send)
					case "$option" in
						-t) _tmux_complete_window "${cur}" ;;
						*) options="-t" ;;
					esac
					;;
			esac # case ${cmd}
		fi    # command specified
	fi     # not -f

	if [[ -n "${options}" ]]; then
		COMPREPLY=("${COMPREPLY[@]:-}" $(compgen -W "${options}" -- "${cur}"))
	fi

	return 0

}
complete -F _tmux tmux

# END tmux completion
