#!/usr/bin/env bash
export PS1

function print_help () {
  local invoke_name='change_bash_prompt'

  cat << EOF
Change the current bash prompt

USAGE: $invoke_name [--help] [color-mode] [components ...]

    [-h|--help]    Show this message

    host | hostname  Hostname of system
    tty              Terminal's name
    pwd | dir        Present working directory
    user             Username
    git              Git branch
    space | tab      4 white space characters
    exit | code      Last non-zero exit code

EXAMPLES:
    $invoke_name  # Reset prompt
    $invoke_name tty pwd git exit   # Default prompt
    $invoke_name tab tab user exit  # Very minimal
EOF
}

# Select color mode =================================================
function is_default_prompt () {
  [[ "$#" -eq 0 ]]
}

function exit_code () {
  local code="$?"

  if [[ "$code" != "0" ]]; then
    printf " [%d]" "$code"
  fi
}

function change_bash_prompt () {
  # Set colors ======================================================
  local purple='\[\033[0;35;1m\]'
  local yellow='\[\033[0;33;1m\]'
  local red='\[\033[0;31;1m\]'

  # Prompt components ===============================================
  local hostname="${purple}"'[\h]'
  local tty="${purple}$(tty | cut -c6-12)"
  local cwd="${yellow}"'\W'
  local user="${red}"'\u'
  local git="${user}"
  local exit="${red}"'$(exit_code)'
  local prompt_end='\[\e[m\]\$ ' # Trailing nbsp (u00A0) for tmux reverse search

  if [ -f ~/.git-prompt.bash ]; then
    local git="${red}"'$(__git_ps1 "(%s)")'
  fi

  local prompt=''

  [[ "$IS_VIFM_NEST" != 'T' ]] || prompt+="<VIFM>"  # Alert when nested in vifm

  # Default prompts =================================================
  if is_default_prompt "$@"; then
    if [[ -n $SSH_TTY ]] || [[ -n $SSH_CLIENT ]] || [[ -n $SSH_CONNECTION ]]; then
      prompt+="${hostname}:${cwd} ${git}${exit}"
    else
      prompt+="${tty}:${cwd} ${git}${exit}"
    fi
  fi

  # Build customized prompts ========================================
  local seperator=':'

  for opt in "$@"; do
    case "$opt" in
      host | hostname) prompt+="$hostname" ;;
      tty)             prompt+="$tty" ;;
      cwd | pwd | dir) prompt+="$cwd" ;;
      user)            prompt+="$user" ;;
      exit | code)     prompt+="$exit" ;;
      git)
        prompt+="$git"
        seperator=''
        ;;
      space | tab)
        prompt+="    "
        seperator=''
        ;;
      -h | --help)
        print_help "$@"
        return 0
        ;;
      *)
        printf 'Unrecognized option `%s`\n' "$opt"
        printf 'Rerun with --help for more information\n'
        return 1
        ;;
    esac

    prompt+="$seperator"
    seperator=' '
  done

  PS1="${prompt}${prompt_end}"
}

change_bash_prompt "$@"

# vim: set ft=bash ff=unix: