# Copyright (C) 2023 The Android Open Source Project
#
# Licensed 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.

usage() {
    me=`basename "$0"`
    echo >&2 "Usage: $me [--help] [--output (K8SGERRIT | GERRIT | COMBINED)] [--platform PLATFORM] [--gerrit-war-url GERRIT_WAR_URL] [--no-docker]"
    exit 1
}

OUTPUT="COMBINED"
USE_DOCKER=true

while test $# -gt 0 ; do
  case "$1" in
  --help)
    usage
    ;;

  --output)
    shift
    OUTPUT=$1
    shift
    ;;

  --platform)
    shift
    PLATFORM=$1
    shift
    ;;

  --no-docker)
    USE_DOCKER=false
    shift
    ;;

  --gerrit-url)
    shift
    GERRIT_WAR_URL=$1
    shift
    ;;

  *)
    break
  esac
done

getK8sVersion() {
    echo "$(git describe --always --dirty --abbrev=10)"
}

getGerritVersionDocker() {
    PLATFORM=${PLATFORM:-linux/amd64}  # Default value if PLATFORM is not set
    GERRIT_VERSION="$(
        docker run \
            --platform=$PLATFORM \
            --entrypoint '/bin/sh' \
            gerrit-base:$(getK8sVersion) \
            -c 'java -jar /var/gerrit/bin/gerrit.war version'
        )"
    GERRIT_VERSION="$(
        echo "${GERRIT_VERSION##*$'\n'}" \
        | cut -d' ' -f3 \
        | tr -d '[:space:]'
    )"
    echo "$GERRIT_VERSION"
}

getGerritVersionNoDocker() {
    GERRIT_BRANCH=${GERRIT_BRANCH:-master}
    GERRIT_WAR_URL=${GERRIT_WAR_URL:-https://gerrit-ci.gerritforge.com/job/Gerrit-bazel-${GERRIT_BRANCH}/lastSuccessfulBuild/artifact/gerrit/bazel-bin/release.war}

    # Create temporary directory for WAR file
    TMP_DIR="./dist"
	mkdir -p $TMP_DIR

    GERRIT_WAR_FILE="$TMP_DIR/gerrit.war"

    if ! test -f "$GERRIT_WAR_FILE"; then
        if ! curl -f -k -s -S -o "$GERRIT_WAR_FILE" "$GERRIT_WAR_URL" 2>&1 >&2; then
            echo "Error: Failed to download Gerrit WAR file from $GERRIT_WAR_URL" >&2
            exit 1
        fi
    fi

    GERRIT_VERSION="$(java -jar "$GERRIT_WAR_FILE" version | cut -d' ' -f3)"

    if [ -z "$GERRIT_VERSION" ]; then
        echo "Error: Could not extract Gerrit version from WAR file" >&2
        exit 1
    fi

    echo "$GERRIT_VERSION"
}

getGerritVersion() {
    if [ "$USE_DOCKER" = "true" ]; then
        getGerritVersionDocker
    else
        getGerritVersionNoDocker
    fi
}

case $OUTPUT in
    K8SGERRIT)
        echo "$(getK8sVersion)"
        ;;
    GERRIT)
        echo "$(getGerritVersion)"
        ;;
    COMBINED)
        echo "$(getK8sVersion)-$(getGerritVersion)"
        ;;
    *)
        usage
        ;;
esac
