#!/bin/bash

set_prompt() {
	last_exitcode="$?"

	declare checkmark fancy_x timestamp git_prompt_msg git_status_short git_status_colour git_unstaged git_untracked

	PS1="${c_reset}"

	# Set a fancy symbol to indicate the last exitcode
	if (( last_exitcode )); then
		last_exitcode_indicator="${c_red}!${c_reset}"
	else
		last_exitcode_indicator="${c_green}.${c_reset}"
	fi

	# Set the username colour
	if (( UID )); then
		user_colour="${c_green}"
		user_indicator='$'
	else
		user_colour="${c_red}"
		user_indicator='#'
	fi

	user_indicator='>'

	# Set the git prompt message
	git rev-parse --git-dir &>/dev/null && {
		git_current_branch="$(git rev-parse --abbrev-ref HEAD)"
		
		while read; do
			case "$REPLY" in
				(' M'*|A*|D*) git_unstaged=1;;
				(\?\?*) git_untracked=1;;
			esac
		done < <( git status --short )

		(( git_unstaged )) && {
			git_status_short+='c'
			git_status_colour="${c_red}"
		}

		(( git_untracked )) && {
			git_status_short+='f'
			git_status_colour="${c_red}"
		}

		git_status_short=${git_status_short:-ok}
		git_status_colour=${git_status_colour:-"${c_green}"}

		git_prompt_msg="(${c_cyan}$git_current_branch${c_reset}[${git_status_colour}${git_status_short}${c_reset}]) "
	}

	set_title "${USER}@${HOSTNAME}"

	if [[ "$PWD" == "$HOME" ]]; then
		prompt_pwd='~'
	elif [[ "$PWD" =~ ^"$HOME" ]]; then
		prompt_pwd="~/${PWD##*${HOME}/}"
	else
		prompt_pwd="$PWD"
	fi

	prompt=(
		"${c_reset}"
		"[${last_exitcode_indicator}]"
		"${user_colour}${USER}${c_reset}@${c_lightblue}${HOSTNAME}"
		"$prompt_pwd"
		"${git_prompt_msg}${user_colour}${user_indicator}"
		"$c_reset"
	)

	PS1="${prompt[@]}"
}
