#!/usr/bin/env bash
set -e

gawk --version &> /dev/null || {
  echo "gawk is required to run this script."
  exit 1
}

mode=
version=
force=

function usage() {
  echo "usage: $0 <-p|-m> <version>"
  echo "   -p for patch release (x.y.Z)"
  echo "   -m for minor release (x.Y.0)"
  echo "   -r for release candidate (x.Y.0rcZ)"
  echo "example: $0 -p 1.1.2"
}

while [ "$1" ]
do
  case "$1" in
  --help)
    usage
    exit 0
    ;;
  -p)
    mode=patch
    ;;
  -r)
    mode=rc
    ;;
  -m)
    mode=minor
    ;;
  -f)
    force=yes
    ;;
  [0-9]*)
    version=$1
    ;;
  esac
  shift
done

function red() {
  echo -e "\033[1;31m$@\033[0m"
}

function die() {
  red "*** $@"
  echo "See also: $0 --help"
  echo
  exit 1
}

hub --version &> /dev/null || die "hub is not in PATH. Get it from https://github.com/github/hub"

if [ "$mode" = "" ]
then
  die "Error: mode flag is mandatory"
fi

if ! [ "$version" ]
then
  die "Error: missing version"
fi

git checkout master
git pull

if ! grep -q "$version" alpine/Dockerfile
then
  if [[ "$force" = "yes" ]]
  then
    echo "Forcing to use the tag even though it is not in master."

    git checkout "$version"

    if ! grep -q "$version$" alpine/Dockerfile
    then
      die "Error: version in build script doesn't match required version."
    fi
  else
    echo "****************************************"
    echo "Error: this script should be run only after the"
    echo "desired release is merged in master of docker-kong."
    echo ""
    echo "For making releases based on old versions,"
    echo "Use -f to override and submit from the tag anyway."
    echo "****************************************"
    die "Failed."
  fi
fi

xy=${version%.*}
z=${version#$xy.}

if [ "$mode" = "rc" ]
then
  rc=${version#*rc}
  z=${z%rc*}
fi

commit=$(git show "$version" | grep "^commit" | head -n 1 | cut -b8-48)

if [ "$mode" = "patch" ]
then
  prev="$xy.$[z-1]"
  prevcommit=$(git show "$prev" | grep "^commit" | head -n 1 | cut -b8-48)
elif [ "$mode" = "rc" -a "$rc" -gt 1 ]
then
  prev="$xy.${z}rc$[rc-1]"
  prevcommit=$(git show "$prev" | grep "^commit" | head -n 1 | cut -b8-48)
fi

rm -rf submit
mkdir submit
cd submit
git clone https://github.com/kong/official-images
cd official-images
git remote add upstream http://github.com/docker-library/official-images
git fetch upstream
git checkout master
git merge upstream/master

git checkout -b release/$version

if [ "$mode" = "patch" ]
then
  sed "s|$prev-alpine|$version-alpine|;
       s|$prev-ubuntu|$version-ubuntu|;
       s|$prev,|$version,|;
       s|$prevcommit|$commit|;
       s|refs/tags/$prev|refs/tags/$version|" library/kong > library/kong.new
  mv library/kong.new library/kong

elif [ "$mode" = "rc" -a "$rc" -gt 1 ]
then
  sed "s|$prev-alpine|$version-alpine|;
       s|$prev-ubuntu|$version-ubuntu|;
       s|, ${xy}rc$[rc-1]|, ${xy}rc${rc}|;
       s|$prev,|$version,|;
       s|$prevcommit|$commit|;
       s|refs/tags/$prev|refs/tags/$version|" library/kong > library/kong.new
  mv library/kong.new library/kong

elif [ "$mode" = "rc" -a "$rc" -eq 1 ]
then
  gawk '
    BEGIN {
      reset = 0
      not_yet_first = 1
    }
    /^Tags/ {
      if (not_yet_first == 1) {
        not_yet_first = 0
        before_first = 1
      }
    }
    {
      if (before_first == 1) {
        v = "'$version'"
        xy = "'$xy'"
        commit = "'$commit'"
        print "Tags: " v "-alpine, " v ", " xy ", alpine"
        print "GitCommit: " commit
        print "GitFetch: refs/tags/" v
        print "Directory: alpine"
        print "Architectures: amd64"
        print ""
        print "Tags: " v "-ubuntu"
        print "GitCommit: " commit
        print "GitFetch: refs/tags/" v
        print "Directory: ubuntu"
        print "Architectures: amd64, arm64v8"
        print ""
        before_first = 0
      } else {
        print
      }
    }
  ' library/kong > library/kong.new
  mv library/kong.new library/kong

elif [ "$mode" = "minor" ]
then
  gawk '
    BEGIN {
      reset = 0
      not_yet_first = 1
    }
    /^Tags/ {
      if (not_yet_first == 1) {
        not_yet_first = 0
        before_first = 1
      }
    }
    /Tags: .*[0-9]rc[0-9].*/ {
      in_rc_tag = 1
    }
    /^ *$/ {
      if (in_rc_tag == 1) {
        reset = 1
      }
    }
    {
      if (before_first == 1) {
        v = "'$version'"
        xy = "'$xy'"
        commit = "'$commit'"
        print "Tags: " v "-alpine, " v ", " xy ", alpine, latest"
        print "GitCommit: " commit
        print "GitFetch: refs/tags/" v
        print "Directory: alpine"
        print "Architectures: amd64, arm64v8"
        print ""
        print "Tags: " v "-ubuntu, " xy "-ubuntu, ubuntu"
        print "GitCommit: " commit
        print "GitFetch: refs/tags/" v
        print "Directory: ubuntu"
        print "Architectures: amd64, arm64v8"
        print ""
        before_first = 0
      }
      if (!(in_rc_tag == 1)) {
        gsub(", latest", "")
        gsub(", alpine", "")
        gsub(", ubuntu", "")
        print
      }
      if (reset == 1) {
        in_rc_tag = 0
        reset = 0
      }
    }
  ' library/kong > library/kong.new
  mv library/kong.new library/kong
fi

echo "****************************************"
git diff
echo "****************************************"

echo "Everything looks all right? (y/n)"
echo "(Answering y will commit, push the branch, and submit the PR)"
read
if ! [ "$REPLY" == "y" ]
then
  exit 1
fi

git commit -av -m "kong $version"
git push --set-upstream origin release/$version

hub pull-request -b docker-library:master -h "release/$version" -m "bump Kong to $version"
