#!/usr/bin/env bash

set -e

print_usage() {
  echo "gs-release - create a new release of a Giant Swarm repo"
  echo " "
  echo "gs-release [SEMVER LEVEL]"
  echo " "
  echo " "
  echo "Options:"
  echo "-h, --help      show this help text"
}

while test $# -gt 0; do
  case "$1" in
    -h|--help)
      print_usage
      exit 0
      ;;
    *)
      break
      ;;
  esac
done

SEMVER=$1

CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null)
MAIN_BRANCH=$(git remote show origin 2>/dev/null|grep HEAD|sed 's/.* //')
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)

if [ "$MAIN_BRANCH" != "$CURRENT_BRANCH" ]; then
  echo "Not currently on main branch, please switch to ${MAIN_BRANCH} to perform a release"
  exit 1
fi

VERSION_PARTS=($(echo $CURRENT_TAG | tr "." "\n"))
VERSION_MAJOR=${VERSION_PARTS[1]}
VERSION_MINOR=${VERSION_PARTS[2]}
VERSION_PATCH=${VERSION_PARTS[3]}

echo "The latest released version is ${CURRENT_TAG}"
echo ""

if [[ "$SEMVER" == "" ]]; then
  printf "What semver release level? (patch, minor or major): "
  read SEMVER
fi

case ${SEMVER} in
  patch)
    VERSION_PATCH=$((VERSION_PATCH+1))
    ;;

  minor)
    VERSION_MINOR=$((VERSION_MINOR+1))
    VERSION_PATCH=0
    ;;

  major)
    if [[ ${VERSION_MAJOR:0:1} == "v" ]]; then
      VERSION_MAJOR="v$((VERSION_MAJOR+1))"
    else
      VERSION_MAJOR=$((VERSION_MAJOR+1))
    fi
    VERSION_MINOR=0
    VERSION_PATCH=0
    ;;

  *)
    echo "Unknown Semver level provided"
    exit 1
    ;;
esac

NEW_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
NEW_BRANCH="${MAIN_BRANCH}#release#${NEW_VERSION}"

echo ""
echo "✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ "
echo "Current version  ${CURRENT_TAG}"
echo "    New version  ${NEW_VERSION}"
echo " Release branch  ${NEW_BRANCH}"
echo "✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ ✨ "
echo ""

printf "Confirm? (y/n): "
read CONFIRM

if [ "${CONFIRM}" = "y" ]; then
  echo "Publishing new release branch..."
  git checkout -b "${NEW_BRANCH}"
  git push -u origin "${NEW_BRANCH}"

  ORG_NAME=$(git remote get-url origin | sed 's/.*github.com[:|\/]//' | sed 's/\.git$//' | tr '/' ' ' | awk '{print $1}')
  REPO_NAME=$(git remote get-url origin | sed 's/.*github.com[:|\/]//' | sed 's/\.git$//' | tr '/' ' ' | awk '{print $2}')

  echo "🚀  Keep an eye on https://github.com/${ORG_NAME}/${REPO_NAME}/pulls for the new release PR"
else
  echo "Aborting..."
  exit 1
fi