#! /bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

run_git_tag () {
  if [ "$DRY_RUN" = "false" ] && [ "$SKIP_TAG" = "false" ]
  then
    git tag -a -f latest "${GITHUB_TAG_NAME}" -m "latest tag"
    echo "${GITHUB_TAG_NAME} has been tagged 'latest'"
  fi
  exit 0
}

SKIP_TAG=false
DRY_RUN=false

# get params passed in with script when it was run
# --dry-run is optional and returns the value of SKIP_TAG, but does not run the git tag statement
# A tag name is required as a param. A SHA won't work. You must first tag a sha with a release number
# and then run this script
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    --dry-run)
    DRY_RUN=true
    shift # past value
    ;;
    *)    # this should be the tag name
    GITHUB_TAG_NAME=$key
    shift # past value
    ;;
esac
done

if [ -z "${GITHUB_TAG_NAME}" ]; then
    echo "Missing tag parameter, usage: ./scripts/tag_latest_release.sh <GITHUB_TAG_NAME>"
    exit 1
fi

if [ -z "$(git show-ref ${GITHUB_TAG_NAME})" ]; then
    echo "The tag ${GITHUB_TAG_NAME} does not exist. Please use a different tag."
    exit 1
fi

# check that this tag only contains a proper semantic version
if ! [[ ${GITHUB_TAG_NAME} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]
then
  echo "This tag ${GITHUB_TAG_NAME} is not a valid release version. Not tagging."
  SKIP_TAG=true
  exit 0
fi

## split the current GITHUB_TAG_NAME into an array at the dot
IFS=$'.'
THIS_TAG_NAME=(${GITHUB_TAG_NAME})  || echo 'not found'

# look up the 'latest' tag on git
LATEST_TAG_LIST=$(git show-ref latest && git show --pretty=tformat:%d -s latest | grep tag:) || echo 'not found'

# if 'latest' tag doesn't exist, then set this commit to latest
if [[ -z "$LATEST_TAG_LIST" ]]
then
  # move on to next task
  echo "there are no latest tags yet, so I'm going to start by tagging this sha as the latest"
  run_git_tag
fi

## get all tags that use the same sha as the latest tag. split at comma.
IFS=$','
LATEST_TAGS=($LATEST_TAG_LIST)

## loop over those tags and only take action on the one that isn't tagged 'latest'
## that one will have the version number tag
for (( i=0; i<${#LATEST_TAGS[@]}; i++ ))
do
  if [[ ${LATEST_TAGS[$i]} != *"latest"* ]]
  then
    ## extract just the version from this tag
    LATEST_RELEASE_TAG=$(echo "${LATEST_TAGS[$i]}" | sed -E -e 's/tag:|\(|\)|[[:space:]]*//g')

    # check that this only contains a proper semantic version
    if ! [[ ${LATEST_RELEASE_TAG} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]
    then
      echo "'Latest' has been associated with tag ${LATEST_RELEASE_TAG} which is not a valid release version. Looking for another."
      continue
    fi
    echo "The current release with the latest tag is version ${LATEST_RELEASE_TAG}"

    ## remove the sha from the latest tag and split into an array- split at the dot
    IFS=$'.'
    LATEST_RELEASE_TAG_SPLIT=(${LATEST_RELEASE_TAG})

    for (( j=0; j<${#THIS_TAG_NAME[@]}; j++ ))
    do
      ## if this value is greater than the latest release, then tag it, if it's lower, then stop, if it's
      ## the same then move on to the next index
      if [[ ${THIS_TAG_NAME[$j]} -gt ${LATEST_RELEASE_TAG_SPLIT[$j]} ]]
      then
        echo "This release tag ${GITHUB_TAG_NAME} is the latest. Tagging it"
        run_git_tag

      elif [[ ${THIS_TAG_NAME[$j]} -lt ${LATEST_RELEASE_TAG_SPLIT[$j]} ]]
      then
        continue
      fi
    done
  fi
done

echo "This release tag ${GITHUB_TAG_NAME} is not the latest. Not tagging."
# if you've gotten this far, then we don't want to run any tags in the next step
SKIP_TAG=true
