#!/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']"
  elif [[ "$rvm_ruby_string" =~ ruby-1.9.3.* ]]
  then
    ruby="puts RbConfig::CONFIG.values_at('sitelibdir','vendorlibdir').detect { |path| File.directory?(File.join(path.to_s, 'rubygems')) }.to_s"
  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.
  entries=(
  "${rubygems_path}/ubygems.rb"
  "${rubygems_path}/gauntlet_rubygems.rb"
  "${rubygems_path}/rbconfig/"
  )
  for entry in "${entries[@]}" "${rubygems_path}/rubygems"*
  do
    __rvm_rm_rf "$entry"
  done
}

can_switch_rubygems()
{
  case "$rvm_ruby_string" in
    jruby*|goru*|maglev*)
      return 1
      ;;
    *)
      return 0
      ;;
  esac
}

rubygems_setup()
{
  __rvm_warn_on_rubyopt

  true ${rvm_ruby_selected_flag:=0}

  unset RUBYOPT

  if (( rvm_ruby_selected_flag == 0 ))
  then
    __rvm_select
  fi

  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"
  # awk '/download.php/ && /tgz/' < <(curl -s http://rubyforge.org/frs/?group_id=126&release_id=45995 ) | sed -e 's#^.*href="#http://rubyforge.org#;s#">.*$##'

  # 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 > 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

  rubygems_remove # Remove old gems.

  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 $rvm_gem_package_name for ${rvm_ruby_string} ..."
  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"

  if [[ -d "$rvm_ruby_gem_home" ]]
  then
    ln -fs "$rvm_ruby_gem_home" "$ruby_lib_gem_path"
  fi

  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 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 can_switch_rubygems
then
  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 < 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_string//-/_}_rubygems_version")"
          version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"}"
          version="${version:-"$(__rvm_db "rubygems_version")"}"
          true ${version:=1.6.2} # Sanity check.
          ;;
      esac

      rubygems_setup
      ;;

    *)
      rubygems_setup
      ;;
  esac
else
  rvm_error "Rubygems version may only be set for an RVM MRI based Ruby, please select one and rerun."
  result=1
fi

exit $result
