#!/usr/bin/env bash

rvm_base_except="selector"

source "$rvm_scripts_path/base"

result=0

# Set it to cleanup the download on interruption.
trap 'cleanup_download' 1 2 3 15

cleanup_download()
{
  [[ -f "$archive" ]] && rm -f "$archive"
}

record_md5()
{
  case "$(uname)" in
    Darwin|FreeBSD)
      archive_md5="$(/sbin/md5 -q "${archive}")"
      ;;
    OpenBSD)
      archive_md5="$(/bin/md5 -q "${archive}")"
      ;;
    Linux|*)
      archive_md5="$(md5sum "${archive}" | awk '{print $1}')"
      ;;
  esac

  "$rvm_scripts_path/db" "$rvm_config_path/md5" "$archive" "$archive_md5"

}

builtin cd "$rvm_archives_path"

# args=($*) # Reserved for future use

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

  rvm_error "BUG: $0 called without an argument :/"

  exit 1
fi

url="$1"; download=1 ; package_name="$2"

if ! command -v curl > /dev/null ; then

  rvm_error "rvm requires curl. curl was not found in your active path."

  exit 1

elif [[ ! -z ${rvm_proxy} ]] ; then

  fetch_command="curl -x${rvm_proxy} -L --create-dirs -C - " # -s for silent

else

  fetch_command="curl -L --create-dirs -C - " # -s for silent

fi

if [[ ! -z "$package_name" ]] ; then

  fetch_command="${fetch_command} -o ${package_name} "

  archive="$package_name"

else

  fetch_command="${fetch_command} -O "

  archive=$(basename "$url")

fi

[[ ${rvm_debug_flag:-0} -gt 0 ]] && rvm_debug "Fetching $archive"

# Check first if we have the correct archive
archive_md5="$("$rvm_scripts_path/db" "$rvm_config_path/md5" "$archive" | head -n1)"

if [[ -e "$archive" && ! -z "$archive_md5" ]] ; then

  [[ ${rvm_debug_flag:-0} -gt 0 ]] && \
    rvm_debug "Found archive and its md5, testing correctness"

  if ! "$rvm_scripts_path"/md5 "$rvm_archives_path/${archive}" "$archive_md5" ; then

    [[ ${rvm_debug_flag:-0} -gt 0 ]] && \
      rvm_debug "Archive md5 did not match, downloading"

    download=1

  else

    [[ ${rvm_debug_flag:-0} -gt 0 ]] && \
      rvm_debug "Archive md5 matched, not downloading"

    download=0

    result=0

  fi

else

  [[ ${rvm_debug_flag:-0} -gt 0 ]] && \
    rvm_debug "No archive or no MD5, downloading"

  download=1

fi

# try to convert the ftp url to a http url
http_url="$(echo "$url" | sed -e 's/ftp:/http:/' -e 's/git:/https:/')"

if [[ $download -gt 0 ]] ; then

  rm -f $archive

  eval $fetch_command "$url" ; result=$?

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

    retry=0

    try_http=0

    if [[ $result -eq 78 ]] ; then

      rvm_error "The requested url does not exist: '$url'"

      try_http=1

    elif [[ $result -eq 18 ]] ; then

      rvm_error "Partial file. Only a part of the file was transferred. Removing partial and re-trying."

      rm -f "$archive"

      retry=1

    elif [[ $result -eq 33 ]] ; then

      [[ ${rvm_debug_flag:-0} -gt 0 ]] && \
        rvm_debug "Server does not support 'range' command, removing '$archive'"

      rm -f "$archive"

      retry=1

    else

      rvm_error "There was an error, please check ${rvm_log_path}/$rvm_ruby_string/*.log. Next we'll try to fetch via http."

      try_http=1

    fi

    if [[ $retry -eq 1 ]] ; then

      eval $fetch_command "$url" ; result=$?

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

        rvm_error "There was an error, please check ${rvm_log_path}/$rvm_ruby_string/*.log"

      else

        record_md5

      fi

    fi

    if [[ $try_http -eq 1 ]] ; then

      rvm_log "Trying http:// URL instead."

      eval $fetch_command "$http_url" ; result=$?

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

        rvm_error "There was an error, please check ${rvm_log_path}/$rvm_ruby_string/*.log"

      else

        record_md5

      fi

    fi

  else

    record_md5

  fi

fi

exit $result
