#!/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.
#

set -ex
if [ "${SKIP_SIDECAR_BUILD}" == "true" ]; then
  echo "Skipping Sidecar Build because SKIP_SIDECAR_BUILD was set to 'true'"
else
  SCRIPT_DIR=$( dirname -- "$( readlink -f -- "$0"; )"; )
  SIDECAR_REPO="${SIDECAR_REPO:-https://github.com/apache/cassandra-sidecar.git}"
  SIDECAR_BRANCH="${SIDECAR_BRANCH:-trunk}"
  SIDECAR_COMMIT="${SIDECAR_COMMIT:-e95786a077e1137dcaae206854986987edc6a71e}"
  SIDECAR_JAR_DIR="$(dirname "${SCRIPT_DIR}/")/dependencies"
  SIDECAR_JAR_DIR=${CASSANDRA_DEP_DIR:-$SIDECAR_JAR_DIR}
  SIDECAR_BUILD_DIR="${SIDECAR_JAR_DIR}/sidecar-build"
  java_ver_output=`"${JAVA:-java}" -version 2>&1`
  jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1`
  JVM_VERSION=${jvmver%_*}
  echo $JVM_VERSION
  if [ "${JVM_VERSION}" == "1.8.0" ]; then
    SIDECAR_BUILD_VERSION="1.0.0-jdk8-analytics"
  else
    SIDECAR_BUILD_VERSION="1.0.0-analytics"
  fi
  if [[ "$CLEAN" == "true" ]]; then
    echo "Clean up $SIDECAR_BUILD_DIR and $SIDECAR_JAR_DIR/org/apache/cassandra/(cassandra-)sidecar directories"
    rm -rf "${SIDECAR_BUILD_DIR}"
    rm -rf "${SIDECAR_JAR_DIR}/org/apache/cassandra/sidecar"
    rm -rf "${SIDECAR_JAR_DIR}/org/apache/cassandra/cassandra-sidecar"
  fi
  mkdir -p "${SIDECAR_BUILD_DIR}"
  cd "${SIDECAR_BUILD_DIR}"
  echo "branch ${SIDECAR_BRANCH} sha ${SIDECAR_COMMIT}"
  # check out the correct cassandra version:
  # if the SIDECAR_BRANCH directory does not exist; we initialize from the scratch
  if [ ! -d "${SIDECAR_BRANCH}" ] ; then
    # if SIDECAR_COMMIT is defined; we pull the specified commit
    if [ -n "${SIDECAR_COMMIT}" ] ; then
      mkdir -p "${SIDECAR_BRANCH}"
      cd "${SIDECAR_BRANCH}"
      git init
      git remote add upstream "${SIDECAR_REPO}"
      git fetch --depth=1 upstream "${SIDECAR_COMMIT}"
      git reset --hard FETCH_HEAD
    else # we pull/clone the branch instead
      git clone --depth 1 --single-branch --branch "${SIDECAR_BRANCH}" "${SIDECAR_REPO}" "${SIDECAR_BRANCH}"
      cd "${SIDECAR_BRANCH}"
    fi
  else # SIDECAR_BRANCH already exists; we are doing delta builds
    cd "${SIDECAR_BRANCH}"
    # no SIDECAR_COMMIT defined; we pull any new commits in the branch
    if [ -z "${SIDECAR_COMMIT}" ] ; then
      git pull upstream "${SIDECAR_BRANCH}"
    else # we pull the specified commit from upstream
      git pull upstream "${SIDECAR_COMMIT}"
    fi
  fi
  if [ -z "${SIDECAR_COMMIT}" ] ; then
    git checkout "${SIDECAR_BRANCH}"
  else
    git checkout "${SIDECAR_COMMIT}"
  fi
  git clean -fd
  ./gradlew -Pversion=${SIDECAR_BUILD_VERSION} -Dmaven.repo.local=${SIDECAR_JAR_DIR} publishToMavenLocal
fi
