#!/bin/bash
gem=$1
gemfiles=${@:1}

brk(){
  echo "$@"
  echo
  continue
}

ask(){
  printf "$2"
  read -r "$1"
}

[ -z "$gem" ] && ask gem "Enter a gem name: "
[ -z "$2" ] && gemfiles=(Gemfile Gemfile.production)

gempattern="gem *['\"]$gem['\"]"

for gemfile in Gemfile Gemfile.production; do
  unset tag;
  unset newtag
  unset defaulttag
  unset lastnum

  echo "Looking to $gemfile for $gem"

  ! grep "$gempattern" "$gemfile" &>/dev/null &&
    brk "Gem '$gem' not found in $gemfile"

  [ $(grep "$gempattern" "$gemfile" | wc -l) -gt 1 ] &&
    brk "Many '$gem' found in $gemfile"

  if grep "$gempattern.*tag:" "$gemfile" &>/dev/null; then
    tag=$(grep "$gempattern" "$gemfile" | sed "s/^.\+tag: *['\"]\(.\+\)['\"].*$/\1/")
  else
    tag=$(grep "$gempattern" "$gemfile" | sed "s/^ *gem[^,]\+, *['\"]\([^'\"]\+\)['\"].*$/\1/")
  fi

  echo "Current tag/version is $tag"

  lastnum=$(echo "$tag" | grep -o "[0-9]\+$")

  if [ -n "$lastnum" ]; then
    defaulttag=$(echo "$tag" | sed "s/[0-9]*$/$(($lastnum+1))/")
    ask newtag "Enter new tag/version for '$gem' (default: $defaulttag): "
    [ -z "$newtag" ] && newtag="$defaulttag"
  else
    ask newtag "Enter new tag/version for '$gem': "
  fi

  [ -z "$newtag" ] &&
    brk "New tag/version is empty. Skipping..."

  sed -i "/$gempattern/s/['\"]$tag['\"]/'$newtag'/" "$gemfile"
  echo "Replaced $tag with $newtag in $gemfile"
  echo
done

type bundle &>/dev/null && bundle install
