#    byobu's bashrc -- colorize the prompt
#    Copyright (C) 2014 Dustin Kirkland
#    Copyright (C) 2023, 2024 Dustin Kirkland
#
#    Authors: Dustin Kirkland <kirkland@byobu.org>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Ensure that we're in a tmux or screen session
case "$TERM" in
	xterm)
		# Try to ensure we have 256 colors
		export TERM="xterm-256color"
	;;
esac
[ -n "$BYOBU_CHARMAP" ] || BYOBU_CHARMAP=$(locale charmap 2>/dev/null || echo)
[ -z "$USER" ] && export USER=$(whoami)
[ -d "$BYOBU_PREFIX" ] || BYOBU_PREFIX="/usr"
[ -r "$BYOBU_PREFIX/lib/byobu/include/dirs" ] && . "$BYOBU_PREFIX/lib/byobu/include/dirs"

byobu_prompt_git() { git branch 2>/dev/null | sed -e "/^[^*]/d" -e "s/* \(.*\)/ (\1)/"; }
byobu_prompt_status() { printf "%s" "[$_byobu_exit_code]"; }
_byobu_save_exit() { _byobu_exit_code=$?; }
byobu_prompt_symbol() { [ "$USER" = "root" ] && printf "%s" "#" || printf "%s" "\$"; }
byobu_prompt_runtime() {
	# Calculate the approximate runtime of the previous command
	# Uses bash 5.0's EPOCHREALTIME
	local starttime endtime duration days hours minutes seconds microseconds nanoseconds str
	[ ! -r $BYOBU_RUN_DIR/timer.$$ ] && printf "[0.000s]" && return
	read starttime < $BYOBU_RUN_DIR/timer.$$ 2>/dev/null || true
	# strip to non-decimal time. avoids LP: #2052610
	endtime=${EPOCHREALTIME/[^0-9]/}
	starttime=${starttime/[^0-9]/}
	duration=$((endtime - starttime))
	days=$((duration/1000000/60/60/24))
	hours=$((duration/1000000/60/60%24))
	minutes=$((duration/1000000/60%60))
	seconds=$((duration/1000000%60))
	nanoseconds=$((duration-days*1000000*60*60*24-hours*1000000*60*60-minutes*1000000*60-seconds*1000000))
	nanoseconds=$(printf "%.6d" ${nanoseconds})
	microseconds=${nanoseconds:0:3}
	# Shorten our string as much as possible
	[ "$days" = "0" ] && days= || days="${days}d "
	[ "$hours" = "0" ] && hours= || hours="${hours}h "
	[ "$minutes" = "0" ] && minutes= || minutes="${minutes}m "
	str="${days}${hours}${minutes}${seconds}.${microseconds}s"
	printf "[%s]" "$str"
	rm -f "$BYOBU_RUN_DIR/timer.$$"
}
# Requires Bash 4.x
# Capture $? into _byobu_exit_code before PROMPT_COMMAND runs anything else that
# might clobber it; PS1 subshells (byobu_prompt_runtime, byobu_prompt_status) each
# reset $?, so we must save it here rather than reading $? inside byobu_prompt_status.
if [ -z "${PROMPT_COMMAND}" ]; then
    PROMPT_COMMAND="_byobu_save_exit"
else
    PROMPT_COMMAND="_byobu_save_exit; ${PROMPT_COMMAND}"
fi
# Only set PS0 if BYOBU_RUN_DIR is set (i.e., inside byobu)
[ -d "$BYOBU_RUN_DIR" ] && export PS0='$(printf "%s" ${EPOCHREALTIME/[^0-9]/} >"$BYOBU_RUN_DIR/timer.$$")'

case "$BYOBU_DISTRO" in
	"Ubuntu")
		# Use Ubuntu colors (grey / orange / aubergine)
		export PS1="\$(byobu_prompt_runtime) --> \$(byobu_prompt_status)\n\[\e[38;5;245m\]\u\[\e[00m\]@\[\e[38;5;172m\]\h\[\e[00m\]:\[\e[38;5;5m\]\w\[\e[00m\]\$(byobu_prompt_git)\$(byobu_prompt_symbol) "
		export GREP_COLORS="ms=01;38;5;202:mc=01;31:sl=:cx=:fn=01;38;5;132:ln=32:bn=32:se=00;38;5;242"
		export LESS_TERMCAP_mb=$(printf '\e[01;31m')       # enter blinking mode – red
		export LESS_TERMCAP_md=$(printf '\e[01;38;5;180m') # enter double-bright mode – bold light orange
		export LESS_TERMCAP_me=$(printf '\e[0m')           # turn off all appearance modes (mb, md, so, us)
		export LESS_TERMCAP_se=$(printf '\e[0m')           # leave standout mode
		export LESS_TERMCAP_so=$(printf '\e[03;38;5;202m') # enter standout mode – orange background highlight (or italics)
		export LESS_TERMCAP_ue=$(printf '\e[0m')           # leave underline mode
		export LESS_TERMCAP_us=$(printf '\e[04;38;5;139m') # enter underline mode – underline aubergine
		# Use Ubuntu themed dircolors
		if [ -e "${BYOBU_PREFIX}/share/byobu/profiles/dircolors" ]; then
			dircolors "${BYOBU_PREFIX}/share/byobu/profiles/dircolors" >| "$BYOBU_RUN_DIR/dircolors"
			. "$BYOBU_RUN_DIR/dircolors"
		fi
	;;
	"Wolfi")
		# Use Wolfi colors (pink / purple / blue)
		# For reference: https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg
		# Convert hex to 256: https://gist.githubusercontent.com/MicahElliott/719710/raw/73d047f0a3ffc35f0655488547e7f24fa3f04ea6/colortrans.py
		# Use Wolfi colors (pink=170 / purple=98 / blue=63); flashing error code on previous command non-zero exit
		export PS1="\$(byobu_prompt_runtime) --> \$(byobu_prompt_status)\n\[\e[38;5;170m\]\u\[\e[00m\]@\[\e[38;5;98m\]\h\[\e[00m\]:\[\e[38;5;63m\]\w\[\e[00m\]\$(byobu_prompt_git)\$(byobu_prompt_symbol) "
	;;
	*)
		# Use primary colors (blue / yellow / red )
		export PS1="\$(byobu_prompt_runtime) --> \$(byobu_prompt_status)\n\[\e[38;5;69m\]\u\[\e[00m\]@\[\e[38;5;214m\]\h\[\e[00m\]:\[\e[38;5;167m\]\w\[\e[00m\]\$(byobu_prompt_git)\$(byobu_prompt_symbol) "
	;;
esac
