#!/bin/bash
# shellcheck disable=SC1091,SC2155
#
# ~/.bashrc
# sourced upon launch of an interactive shell, which isn't a login shell has been executed
#

case $- in
*i*) ;;
*) return ;;
esac
[ -z "${PS1-}" ] && return

# lazy loading of ssh agents
__lazy_ssh_agent() {
	if [ -z "$SSH_AUTH_SOCK" ]; then
		eval "$(ssh-agent -s)" >/dev/null
		ssh-add "$HOME/.ssh/github" >/dev/null 2>&1
		ssh-add "$HOME/.ssh/gitea" >/dev/null 2>&1
		ssh-add "$HOME/.ssh/admin@homeserver" >/dev/null 2>&1
	fi
}
# aliases so the function is called beforehand
alias ssh='__lazy_ssh_agent; ssh'
alias sudo='__lazy_ssh_agent; sudo'

# colourises make output, so when it prints via
# $(warning) or $(error), it is formatted properly
__colour_make() {
	make "$@" 2> >(sed -E \
		-e "s/^([Mm]akefile:[0-9]+:.*)/\x1b[33m\1\x1b[0m/" \
		-e "s/^.*error.*$/\x1b[31m&\x1b[0m/I" >&2)
}
alias make='__colour_make'

# lazily loads the git utilities, to prevent slowdowns
__lazy_git_ps1() {
	if [ -z "$__GIT_PROMPT_SOURCED__" ]; then
		if [ -d .git ] || git worktree list &>/dev/null; then
			. /usr/share/bash-completion/completions/git &>/dev/null
			. /usr/share/git/completion/git-prompt.sh &>/dev/null
			export __GIT_PROMPT_SOURCED__=1
			__git_ps1
		fi
	else __git_ps1; fi
	return 0
}

# regenerates the PS1 prompt
__regenprompt() {
	local err=$? # acquire the error code of the last executed command
	local git=$(__lazy_git_ps1)

	# Format the error code to be in the last column of the terminal
	# this shall be printed as non-printable characters, so won't effect text wrapping.
	if [ $err -ne 0 ]; then
		err="\033[$((COLUMNS - 4))G\033[01;31m${err}\033[0G"
	else unset err; fi

	PS1="\[$err\]"                  # error code
	PS1="$PS1\[\033[?25h\]"         # show cursor
	PS1="$PS1\[\033[01;35m\]\u@\h"  # user@host
	PS1="$PS1\[\033[00m\]:"         # separator
	PS1="$PS1\[\033[01;34m\]\w"     # working directory
	PS1="$PS1\[\033[01;93m\]${git}" # git branch
	PS1="$PS1\[\033[00m\]\$ "       # shell sign
}
PROMPT_COMMAND=__regenprompt

# history settings
HISTSIZE=2048
HISTCONTROL=erasedups:ignoredups:ignorespace
HISTIGNORE='exit*:clear*:\:*:echo*'

shopt -s checkwinsize # check the window size after each command (and if necessary, the values of LINES and COLUMNS)
shopt -s globstar     # enable globstar (**/*)

[ -f "$HOME/.bash_aliases" ] && . "$HOME/.bash_aliases"

# cute lil hyfetch :3
[ "$TERM" == "xterm-kitty" ] && fastfetch
