#!/usr/bin/env bash

git version
echo "git-extras version ""$(git-extras -v)"
echo "Type 'ls' to ls files below current directory; '!command' to execute any command or just 'subcommand' to execute any git subcommand; 'quit', 'exit', 'q', ^D, or ^C to exit the git repl."

while true; do
  # Current branch
  cur=$(git symbolic-ref HEAD 2> /dev/null | cut -d/ -f3-)

  # Prompt
  if test -n "$cur"; then
    cur_string=" ($cur)"
  else
    cur_string=""
  fi
  if test -n "$exit_status" && test "$exit_status" -ne 0; then
    es_string=$' \e[31m['"$exit_status"$']\e[0m'
  else
    es_string=""
  fi
  prompt_character=$(git config --get --default '>' git-extras.repl.prompt-character)

  prefix=$(git config --get --default 'git' git-extras.repl.prefix)

  show_project_name=$(git config --get --default 'false' git-extras.repl.show-project-name)
  if [[ "$show_project_name" == "true" ]]; then
    project_name=" $(basename "$(git rev-parse --show-toplevel)" .git)"
  else
    project_name=""
  fi

  prompt_base="$prefix$project_name$cur_string$es_string$prompt_character"
  prompt_base_stripped=$(echo "$prompt_base" | awk '{$1=$1};1')
  prompt="$prompt_base_stripped "

  # Use arguments as a command if any are provided.
  if [ $# -ne 0 ]; then
    cmd=$*
    set --
    echo "$prompt" "$cmd" # It is as though you had entered a command.
  else
    # Readline
    read -e -r -p "$prompt" cmd
    # Check for EOF, and end the program if so (handles ^D).
    test $? -ne 0 && break
  fi

  # History
  history -s "$cmd"

  # Built-in commands
  case $cmd in
    ls) cmd=ls-files;;
    "")
      on_enter_cmd=$(git config --get --default '' git-extras.repl.on-enter-command)
      if test -n "$on_enter_cmd"; then
        cmd="$on_enter_cmd"
      else
        continue
      fi
      ;;
    quit|exit|q) break;;
  esac

  if [[ $cmd == !*  ]]; then
    # shellcheck disable=SC2086
    eval ${cmd:1}
  elif [[ $cmd == git* ]]; then
    # shellcheck disable=SC2086
    eval $cmd
  else
    eval git "$cmd"
  fi
  exit_status=$?
done

echo
