#!/usr/bin/env bash

usage() {
  printf "

  Usage:

    rvm-install-system-wide [options]

  Options:

    --trace      - Run turn on bash xtrace while the script runs.
    --debug      - Turn on bash verbose while the script runs.
    --version X  - Install RVM version X
    --revision X - Install RVM revision X (sha1)
    --help       - Display this usage text.

"
return 0
}

__rvm_system_wide_permissions() {
  [[ -z "$1" ]] && return 1

  chown -R root:"$rvm_group_name" "$1"

  chmod -R g+w "$1"

  if [[ -d "$1" ]] ; then
    find "$1" -type d -print0 | xargs -n1 -0 chmod g+s
  fi

  return 0
}

__rvm_create_user_group() {
  [[ -z "$1" ]] && return 1

  if \grep -q "$1" /etc/group ; then
    echo "Group '$1' exists, proceeding with installation."
  else
    echo "Creating the group '$1'"

    case "$os_type" in
      "OpenBSD") groupadd "$rvm_group_name";;
      "FreeBSD") pw groupadd -q "$rvm_group_name";;
      "Linux")
        if [[ -f "/etc/SuSE-release" ]] ; then
          groupadd "$rvm_group_name"
        else
          groupadd -f "$rvm_group_name"
        fi
      ;;
      "Darwin")
        gid="501" #only gids > 500 show up in user preferences

        #Find an open gid
        while true; do
          name=$(dscl . search /groups PrimaryGroupID $gid | cut -f1 -s)
          if [ -z "$name" ] ; then
            break
          fi
          gid=$[$gid +1]
        done

        #Create the group
        dscl . -create "/Groups/$rvm_group_name"
        dscl . -create "/Groups/$rvm_group_name" gid "$gid"
      ;;
      "SunOS") groupadd "$rvm_group_name";;
    esac
  fi

  return 0
}

__rvm_add_user_to_group() {
  [[ -z "$1" || -z "$2" ]] && return 1

  echo "Adding '$1' to the group '$2'"

  case "$os_type" in
    "OpenBSD") usermod -G "$2" "$1";;
    "FreeBSD") pw usermod "$1" -G "$2";;
    "Linux")
      if [[ -f "/etc/SuSE-release" ]] ; then
        groupmod -A "$1" "$2"
      else
        /usr/sbin/usermod -a -G "$2" "$1"
      fi
    ;;
    "Darwin")  dscl . -append "/Groups/$2" GroupMembership "$1";;
    "SunOS")
      groups="`id -G "$1"` \"$2\""
      csv_groups=$(echo $groups | tr " " ", ")
      usermod -G "$csv_groups" "$1"
  esac

  return 0
}

os_type="$(uname)"

# Require root to install it.
if [[ $UID -ne 0 ]]; then
  echo "Please rerun this installer as root." >&2
  exit 1

# Check for the presence of git.
elif [[ -z "$(command -v git)" ]] ; then
  echo "Please ensure git is installed and available in PATH to continue." >&2
  exit 1

else
  case "$os_type" in

    OpenBSD|Linux|FreeBSD|Darwin|SunOS)
      : # All clear, proceed!
    ;;

    *)
      echo "The rvm system wide installer currently only supports the OS types:" >&2
      echo "Linux, FreeBSD, OpenBSD, Darwin and SunOS" >&2
      echo "'$os_type' is currently unknown." >&2
      exit 1
    ;;
  esac
fi

while [[ $# -gt 0 ]] ; do
  case $1 in
    --trace)
      rvm_trace_flag=1
      set -o xtrace
      ;;
    --debug)
      rvm_trace_flag=1
      set -o verbose
      ;;
    --version)
      if [[ -n "${2:-""}" ]] ; then
        version="$2"
        shift
      else
        usage
        exit 1
      fi
      ;;
    --revision)
      if [[ -n "${2:-""}" ]] ; then
        revision="$2"
        shift
      else
        usage
        exit 1
      fi
      ;;
    --help)
      usage
      exit 0
      ;;
    *)
      usage
      exit 1
    ;;
  esac
  shift
done

# Load the rvm config.
rvm_ignore_rvmrc=${rvm_ignore_rvmrc:-0}
if [[ $rvm_ignore_rvmrc -eq 0 ]]; then
  [[ -s /etc/rvmrc ]] && source /etc/rvmrc
  [[ -s "$HOME/.rvmrc" ]] && source "$HOME/.rvmrc"
fi

rvm_path="${rvm_path:-"/usr/local/rvm"}"
export rvm_selfcontained=0

rvm_group_name="${rvm_group_name:-"rvm"}"

__rvm_create_user_group "$rvm_group_name"
__rvm_add_user_to_group "${USER:-$(id | sed -e 's/^[^(]*(//' -e 's/).*$//')}" "$rvm_group_name"

echo "Creating the destination dir and making sure the permissions are correct"
mkdir -p "$rvm_path"
__rvm_system_wide_permissions "$rvm_path"

mkdir -p "$rvm_path/src/"
builtin cd "$rvm_path/src"

[[ -d "$PWD/rvm/" ]] && rm -rf "$PWD/rvm/"

git clone --depth 1 git://github.com/wayneeseguin/rvm.git || git clone http://github.com/wayneeseguin/rvm.git

builtin cd rvm

if [[ "${revision:-""}" ]]; then
  echo "Checking out revision $revision"
  git fetch --depth=256
  git checkout $revision
elif [[ "${version:-""}" ]]; then
  echo "Checking out version $version"
  git checkout $version
fi

echo "Running the install script."
bash ./scripts/install "$@"

__rvm_system_wide_permissions "$rvm_path"

echo "Setting up group permissions"
rvm_parent_dir="$(dirname "$rvm_path")"
for dir in bin share/man; do
  __rvm_system_wide_permissions "$rvm_parent_dir/$dir"
done; unset dir

echo "Generating system wide rvmrc"
rm -f /etc/rvmrc
touch /etc/rvmrc
cat > /etc/rvmrc <<END_OF_RVMRC
# Setup default configuration for rvm.
# If an rvm install exists in the home directory, don't load this.'
if [[ ! -s "\$HOME/.rvm/scripts/rvm" ]]; then
  umask g+w
  export rvm_selfcontained=0
  export rvm_prefix="$rvm_parent_dir/"
fi
END_OF_RVMRC

echo "Generating $rvm_parent_dir/lib/rvm to load rvm"
mkdir -p "$rvm_parent_dir/lib/"
rm -f "$rvm_parent_dir/lib/rvm"
touch "$rvm_parent_dir/lib/rvm"
cat > "$rvm_parent_dir/lib/rvm" <<END_OF_RVM_SH
# Automatically source rvm
if [[ -s "\$HOME/.rvm/scripts/rvm" ]]; then
  source "\$HOME/.rvm/scripts/rvm"
elif [[ -s "${rvm_path:=/usr/local/rvm}/scripts/rvm" ]]; then
  source "${rvm_path:=/usr/local/rvm}/scripts/rvm"
fi
END_OF_RVM_SH

echo "Correct permissions on rvmrc and the rvm loader"
# Finally, ensure the rvmrc is owned by the group.
for file in /etc/rvmrc "$rvm_parent_dir/lib/rvm" ; do
  __rvm_system_wide_permissions "$file"
done; unset file

echo "RVM is now installed. To use, source '$rvm_parent_dir/lib/rvm' to your shell profile."

unset rvm_parent_dir