#!/bin/bash
#
# set_prompt - define useful constants and load bash prompts which use them

# shellcheck disable=SC2034
function set_prompt()
{
  local STYLES_DIR="${BASH_SOURCE%/*}/styles"

  if [ "x$1" = "x" ];
  then
    echo "Available prompts:";
    for file in "$STYLES_DIR"/*;
    do
      grep -q '^[ \t]*PS1' "$file" && echo "  $(basename "$file")";
    done

    return 0
  fi

  local STYLE_FILE="$STYLES_DIR/$1"

  if [ ! -f "$STYLE_FILE" ];
  then
    echo "Cannot find prompt style '$(basename "$STYLE_FILE")'." 1>&2
    return 1
  fi

  # ANSI Escape Color
  # http://www.termsys.demon.co.uk/vtansi.htm
  # http://ascii-table.com/ansi-escape-sequences.php
  # http://www2.gar.no/glinkj/help/cmds/ansa.htm
  # http://vt100.net/docs/tp83/appendixh.html

  local ATTR_RESET=0
  local BOLD=1
  local DIM=2

  local UNDERSCORE=4
  local BLINK=5

  local REVERSE=7
  local HIDDEN=8

  local FG_BLACK=30
  local FG_RED=31
  local FG_GREEN=32
  local FG_YELLOW=33
  local FG_BLUE=34
  local FG_MAGENTA=35
  local FG_CYAN=36
  local FG_WHITE=37

  local FG_NULL=00

  local BG_BLACK=40
  local BG_RED=41
  local BG_GREEN=42
  local BG_YELLOW=43
  local BG_BLUE=44
  local BG_MAGENTA=45
  local BG_CYAN=46
  local BG_WHITE=47

  local BG_NULL=00

  # ANSI Escape Commands
  #
  # NOTE:
  #
  # Bash recommends enclosing non-printing characters in a delimited sequence.
  #
  # From the bash(1) man page:
  #
  # \[     begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
  # \]     end a sequence of non-printing characters
  #
  local ESC='\033'
  local RESET="\\[${ESC}[${ATTR_RESET}m\\]"

  # Shortcuts for Colored Text (Foreground Only)

  # NORMAL TEXT
  local BLACK="\\[${ESC}[${ATTR_RESET};${FG_BLACK}m\\]"
  local RED="\\[${ESC}[${ATTR_RESET};${FG_RED}m\\]"
  local GREEN="\\[${ESC}[${ATTR_RESET};${FG_GREEN}m\\]"
  local YELLOW="\\[${ESC}[${ATTR_RESET};${FG_YELLOW}m\\]"
  local BLUE="\\[${ESC}[${ATTR_RESET};${FG_BLUE}m\\]"
  local MAGENTA="\\[${ESC}[${ATTR_RESET};${FG_MAGENTA}m\\]"
  local CYAN="\\[${ESC}[${ATTR_RESET};${FG_CYAN}m\\]"
  local WHITE="\\[${ESC}[${ATTR_RESET};${FG_WHITE}m\\]"

  # BOLD TEXT
  local BOLD_BLACK="\\[${ESC}[${BOLD};${FG_BLACK}m\\]"
  local BOLD_RED="\\[${ESC}[${BOLD};${FG_RED}m\\]"
  local BOLD_GREEN="\\[${ESC}[${BOLD};${FG_GREEN}m\\]"
  local BOLD_YELLOW="\\[${ESC}[${BOLD};${FG_YELLOW}m\\]"
  local BOLD_BLUE="\\[${ESC}[${BOLD};${FG_BLUE}m\\]"
  local BOLD_MAGENTA="\\[${ESC}[${BOLD};${FG_MAGENTA}m\\]"
  local BOLD_CYAN="\\[${ESC}[${BOLD};${FG_CYAN}m\\]"
  local BOLD_WHITE="\\[${ESC}[${BOLD};${FG_WHITE}m\\]"

  # Some shortcuts to switch charset mode
  # https://en.wikipedia.org/wiki/Box-drawing_characters#Unix.2C_CP.2FM.2C_BBS

  # From the console_codes(4) man page:
  #
  # ESC ( B               Select default (ISO 8859-1 mapping)
  # ESC ( 0               Select VT100 graphics mapping
  local MODE_DEFAULT='\[\033(B\]'
  local MODE_GRAPHIC='\[\033(0\]'

  # The linux tty terminal does not display the DEC graphic set when it is in
  # UTF-8 mode (see also unicode_start and kbd_mode) so disable UTF-8 when
  # entering the GRAPHIC mode and re-enable it in DEFAULT mode.
  #
  # From the console_codes(4) man page:
  #
  # ESC % @               Select default (ISO 646 / ISO 8859-1)
  # ESC % G               Select UTF-8
  #
  case $TERM in
    linux*)
      # TODO: check if the terminal is actually in UTF-8 mode, maybe using
      # kbd_mode.
      MODE_DEFAULT='\[\033(B\033%G\]'
      MODE_GRAPHIC='\[\033%@\033(0\]'

      # If the variables from above were used in a printf format string (e.g.
      # inside the __git_ps1 argument), '%G' and '%@' would be wrongly
      # interpreted as conversion specifiers.
      #
      # Define alternative variables to use with printf, to ensure that
      # a literal '%' is produced eventually in the output of printf.
      MODE_DEFAULT_QUOTED='\[\033(B\033%%G\]'
      MODE_GRAPHIC_QUOTED='\[\033%%@\033(0\]'
      ;;
    *)
      local MODE_DEFAULT_QUOTED="$MODE_DEFAULT"
      local MODE_GRAPHIC_QUOTED="$MODE_GRAPHIC"
      ;;
  esac

  # VT100 Line Drawing Set
  # http://vt100.net/docs/vt102-ug/table5-15.html
  #
  # Also called DEC Special Graphics set
  # https://en.wikipedia.org/wiki/DEC_Special_Graphics

  local UPPER_LEFT_CORNER="l"
  local UPPER_RIGHT_CORNER="k"
  local LOWER_LEFT_CORNER="m"
  local LOWER_RIGHT_CORNER="j"

  local CROSS="n"

  local HORIZ_LINE="q"
  local VERT_LINE="x"

  local UPPER_T="v"
  local LOWER_T="w"
  local RIGHT_T="t"
  local LEFT_T="u"

  local CENTERED_DOT="~"

  local SOLID_BLOCK="a"
  local TRANSPARENT_BLOCK="_"

  # An attempt to reset the charset attributes.
  # http://www.in-ulm.de/~mascheck/various/alternate_charset/
  #
  # ESC (B                      Select G0 Character Set: United States (USASCII)
  # ESC )0                      Select G1 Character Set: Special Character and Line Drawing Set
  # O        ( Ctrl-O )         Switch to Standard Character Set
  # ESC [?5l                    DEC Private Mode Reset: Normal Video
  # ESC 7                       Save Cursor
  # ESC [r                      weird (actually 'ESC [0;0r' ? Set Scrolling Region [top;bottom] )
  # ESC 8                       Restore Cursor
  local RESET_CHARSET='\[\033(B\033)0\017\033[?5l\0337\033[r\0338\]'

  # Add the current user@host : pwd to the xterm title bar
  case $TERM in
    xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix)
      PROMPT_COMMAND='export ERR=$?; true; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/\~}\007"'
      ;;
    screen*)
      PROMPT_COMMAND='export ERR=$?; true; echo -ne "\033k${USER}@${HOSTNAME%%.*}:${PWD/$HOME/\~}\033\\"'
      ;;
    *)
      PROMPT_COMMAND='export ERR=$?; true'
      ;;
  esac

  # shellcheck source=/dev/null
  source "$STYLE_FILE"

  export PS1 PROMPT_COMMAND
}