#!/usr/bin/env bash

unset rvm_default_flag rvm_wrapper_name

source "$rvm_scripts_path/base"

usage() {
  printf "

  Usage:

    rvm alias [action] [arguments]

  Examples:

    rvm alias create [alias_name] [ruby]
    rvm alias delete [alias_name]
    rvm alias show [alias_name]
    rvm alias list

"
}

alias_conflicts_with_ruby() {
  # If default exists, we should return true.
  [[ "$1" == "default" && ! -L "$rvm_rubies_path/default" ]] && return 1
  # Open for suggestions to a better way of doing this...
  alias_check_result="$(
    \. "$rvm_scripts_path/initialize"
    \. "$rvm_scripts_path/selector"
    export rvm_ruby_string=\"$1\"
    __rvm_ruby_string > /dev/null 2>&1
    echo "$?"
  )"

  if [[ "0" == "$alias_check_result" ]]; then
      rvm_error "You have attempted to create an alias called '$1', which is recognized as a rvm ruby."
    return 0
  fi

  return 1

  unset alias_check_result
}

alias_show() {
  local expanded_alias_name

  if [[ -z "$alias_name" ]]; then
    rvm_log "usage: 'rvm alias show [alias_name]'"
    result=1
    return
  fi

  expanded_alias_name="$("$rvm_scripts_path"/db "$rvm_config_path/alias" "$alias_name")"

  if [[ -z "$expanded_alias_name" ]]; then
    rvm_error "Unknown alias name: '$alias_name'"
    result=1
  else
    result=0
    if [[ -n "$gemset_name" ]] ; then
      printf "${rvm_gemset_separator:-"@"}${rvm_gemset_separator:-"@"}${gemset_name}\n"
    else
      printf "$expanded_alias_name\n"
    fi
  fi
}

alias_delete() {
  echo "Deleting alias: $alias_name"

  for link in "$rvm_rubies_path/$alias_name" ; do
    if [[ -L "$link" ]] ; then rm -f $link ; fi
  done

  "$rvm_scripts_path"/db "$rvm_config_path/alias" "$alias_name" "delete"
}

alias_create() {

  alias_name="${alias_name:-""}"

  rvm_ruby_string="${rvm_ruby_string:-""}"

  if [[ "default" != "$alias_name" ]] && alias_conflicts_with_ruby "$alias_name"; then
    # Force it to an empty alias name to trigger the usage.
    alias_name=""
  fi

  if [[ -z "${rvm_environment_identifier:-""}" || -z "$alias_name" ]] ; then

    rvm_error "usage: 'rvm alias [alias_name] [ruby_string]'"

    result=1
  else

    if [[ "default" = "$alias_name" ]] ; then
      rvm_alias=""
    fi

    if [[ -z "$rvm_alias" ]] ; then

      rvm_ruby_string="$rvm_environment_identifier"

      if [[ -z "$rvm_alias_expanded" ]]; then

        rvm_expanding_aliases=1

        __rvm_become

        unset rvm_expanding_aliases

      else

        rvm_ruby_string="$rvm_environment_identifier"

      fi

      if [[ -z "$rvm_ruby_string" ]]; then

        rvm_error "Unknown ruby string '$rvm_ruby_string' specified"

        result=1

        return $result
      fi

      final_environment_identifier="${rvm_environment_identifier:-$(__rvm_environment_identifier)}"

      rvm_log "Creating alias $alias_name for $final_environment_identifier."

      ln -fs "$rvm_rubies_path/$rvm_ruby_string" "$rvm_rubies_path/$alias_name"

      rvm_log "Recording alias $alias_name for $final_environment_identifier."

      "$rvm_scripts_path"/db "$rvm_config_path/alias" "$alias_name" "$final_environment_identifier"

    else

      if [[ -d "$rvm_rubies_path/$alias_name" ]] ; then

        rvm_error "$rvm_rubies_path/$alias_name is taken and is *not* able to be an alias name."

        result=1

      else

        rvm_error "$rvm_rubies_path/$alias_name is already aliased."

        result=1

      fi
    fi
  fi
}

alias_list() {

  local item items

  items=($(cd "$rvm_rubies_path" ; find . -maxdepth 1 -mindepth 1 -type l | sed -e 's#./##'))

  for item in "${items[@]}" ; do

    echo "$(basename "$item") => $("$rvm_scripts_path"/db "$rvm_config_path/alias" "$(basename "$item")")"

  done

}

args=($*)
action="${args[0]:-""}"
alias_name="${args[1]:-""}"
rvm_environment_identifier="${args[2]:-""}"
args="$(echo ${args[@]:3}) " # Strip trailing / leading / extra spacing.
result=0

if [[ ! -f "$rvm_config_path/alias" ]] ; then touch "$rvm_config_path/alias" ; fi

if printf "$alias_name" | grep "${rvm_gemset_separator:-"@"}" >/dev/null 2>&1 ; then
  gemset_name="${alias_name/*${rvm_gemset_separator:-"@"}/}"
  alias_name="${alias_name/${rvm_gemset_separator:-"@"}*/}"
else
  gemset_name=""
fi

if [[ -n "$alias_name" ]] ; then
  rvm_alias="$("$rvm_scripts_path/db" "$rvm_config_path/alias" "$alias_name")"
fi

case "$action" in
  delete)
    alias_delete
    ;;
  create)
    alias_create
    ;;
  list)
    alias_list
    ;;
  show)
    alias_show
    ;;
  help|usage)
    usage
    ;;
  *)
    usage
    exit 1
    ;;
esac

exit $?
