#!/usr/bin/env bash

source "$rvm_scripts_path/base"
source "$rvm_scripts_path/functions/db"

result=0

__rvm_become

rubygems_remove()
{
  local rubygems_path ruby entry

  rvm_log "Removing old Rubygems files..."

  if [[ "$rvm_ruby_interpreter" = "rbx" ]]; then
    ruby="puts Config::CONFIG['prefix']"
  else
    ruby="puts Config::CONFIG.values_at('sitelibdir','vendorlibdir').detect { |path| File.directory?(File.join(path.to_s, 'rubygems')) }.to_s"
  fi
  rubygems_path="$(ruby -rrbconfig -e "$ruby")"

  # Remove common files installed by ruby gems.
  for entry in "${rubygems_path}/ubygems.rb" "${rubygems_path}/rubygems"* "${rubygems_path}/gauntlet_rubygems.rb" "${rubygems_path}/rbconfig/" ; do
    __rvm_rm_rf "$entry"
  done

  rvm_log "Installing rubygems dedicated to ${rvm_ruby_string}..."
}

rubygems_setup()
{
  __rvm_warn_on_rubyopt

  unset RUBYOPT

  if (( ${rvm_ruby_selected_flag:=0} == 0 ))
  then
    __rvm_select
  fi

  case "$rvm_ruby_string" in
    jruby*|goru*)
      install=0
      ;;
    *)
      install=1
      ;;
  esac

  if [[ $install -eq 0 ]] ; then
    rvm_error "Cannot switch to ${version} for this interpreter."
    exit 1
  fi

  rubygems_remove # First we remove to enforce a good state.

  rvm_rubygems_version="$version"
  rvm_gem_package_name="rubygems-${rvm_rubygems_version}"
  rvm_rubygems_url=$(__rvm_db "rubygems_url")
  rvm_gem_url="${rvm_rubygems_url}/${rvm_gem_package_name}.tgz"

  # Sanity check... If setup.rb is missing from the rubygems source path,
  # something went wrong. Cleanup, aisle 3!
  if [[ ! -f "${rvm_src_path}/$rvm_gem_package_name/setup.rb" ]]; then
    __rvm_rm_rf "${rvm_src_path}/$rvm_gem_package_name"
  fi

  if [[ ! -d "${rvm_src_path}/${rvm_gem_package_name}" ]] ; then

    rvm_log "Retrieving $rvm_gem_package_name"

    "$rvm_scripts_path/fetch" "$rvm_gem_url" ; result=$?

    if [[ "$result" -gt 0 ]] ; then

      rvm_error "There has been an error while trying to fetch the source. \nHalting the installation."

      return $result

    fi

    if [[ ! -d "${rvm_src_path}/$rvm_gem_package_name" ]] ; then
      \mkdir -p "${rvm_src_path}/$rvm_gem_package_name"
    fi

    __rvm_run "rubygems.extract" \
      "gunzip < ${rvm_archives_path}/$rvm_gem_package_name.tgz | tar xf - -C ${rvm_src_path}" \
      "Extracting $rvm_gem_package_name ..."
  fi

  builtin cd "${rvm_src_path}/$rvm_gem_package_name"

  __rvm_run "rubygems.install" \
    "GEM_PATH=\"$GEM_PATH:${GEM_PATH%%@*}@global\" GEM_HOME=\"$GEM_HOME\" \"${rvm_ruby_binary}\" \"${rvm_src_path}/$rvm_gem_package_name/setup.rb\"" \
    "Installing rubygems for $rvm_ruby_home/bin/ruby"
  result=$?
  if (( result == 0 ))
  then
    rvm_log "Installation of rubygems completed successfully."
  else
    rvm_warn "Installation of rubygems did not complete successfully."
  fi

  if [[ ! -z "$rvm_ruby_major_version" ]]
  then
    ruby_lib_gem_path="$rvm_ruby_home/lib/ruby/gems/${rvm_ruby_release_version}.${rvm_ruby_major_version}"
  else
    ruby_lib_gem_path="$rvm_ruby_home/lib/ruby/gems/$interpreter"
  fi

  # Add ruby's gem path to ruby's lib direcotry.
  \mkdir -p "$(dirname $ruby_lib_gem_path)"

  __rvm_rm_rf "$ruby_lib_gem_path"

  [[ -d "$rvm_ruby_gem_home" ]] && ln -fs "$rvm_ruby_gem_home" "$ruby_lib_gem_path"

  unset ruby_lib_gem_path
}

if ! command -v ruby > /dev/null ; then
  rvm_error "'ruby' was not found, cannot install rubygems unless ruby is present (Do you have an RVM ruby installed & selected?)"
  exit 1
fi

#
# rvm rubygems use X
#
args=($*)
version="${args[0]}"
args="$(echo ${args[@]:1}) " # Strip trailing / leading / extra spacing.

if [[ -z "$version" ]] ; then
  rvm_error "Usage: rvm rubygems [x.y.z|latest|remove]"
  exit 1
fi

if ! command -v ruby | grep "rvm" >/dev/null 2>&1 ; then

  rvm_error "Rubygems version may only be set for an RVM MRI based Ruby, please select one and rerun."

  exit 1

fi

case "$version" in

  remove)
    rubygems_remove
    ;;

  latest|current) # Install latest known version of rubygems for the given interpreter.
    case "$rvm_ruby_string" in
      ruby-1.8*)
        version="${rvm_ruby_version//*.}"
        if [[ $version -lt 7 ]] ; then
          version=1.3.7
        else
          version="$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"
          version="${rvm_rubygems_version:-"$(__rvm_db "rubygems_version")"}"
          true ${version:=1.6.2} # Sanity check.
        fi
        ;;
      *)
        version="$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"
        version="${rvm_rubygems_version:-"$(__rvm_db "rubygems_version")"}"
        true ${version:=1.6.2} # Sanity check.
        ;;
    esac

    rubygems_setup
    ;;

  *)
    rubygems_setup
    ;;

esac

exit $result
