#!/usr/bin/env bash
#
# blame(ken)
#
# this runs "mvn clean install" with appropriate environment, params, AWS credentials, etc...

set -e          # raise exception if error
set -u          # raise exception if unset
set -o pipefail # raise exceptions in pipes

BASENAME=$(basename $0)
WORKDIR=$(cd $(dirname $0);pwd -P;)
cd $WORKDIR

unset   AWS_SECURITY_TOKEN \
        AWS_SESSION_TOKEN \
        AWS_ACCESS_KEY \
        AWS_SECRET_KEY \
        AWS_ACCESS_KEY_ID \
        AWS_SECRET_ACCESS_KEY \
        AWS_SHARED_CREDENTIALS_FILE \
        AWS_CREDENTIAL_PROFILES_FILE

export  AWS_CREDENTIAL_PROFILES_FILE=$WORKDIR/aws-credentials \
        SPRING_PROFILES_ACTIVE=test,pipeline-test \
        AWS_REGION=us-east-1 \
        TZ=UTC

# check java version
expected_version=25
if [[ -n ${JAVA_HOME-} ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
    _java="$JAVA_HOME/bin/java"
elif [[ -n $(type -p java) ]]; then
    _java=java
else
    echo "Missing Java!  Set JAVA_HOME environment variable to the path to a JDK."
    exit 1
fi

version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
if [[ "$version" < $expected_version ]]; then
    echo "This project requires Java $expected_version, but the current JDK version is $version"
    echo "Set JAVA_HOME to the directory of a $expected_version JDK."
    exit 1
fi
# end check java version

# mysql + redis containers
function cleanup {
  docker rm -f core_mysql_test
  docker rm -f core_redis_test
}
trap cleanup EXIT

function checkConnection {
  # Maximum number of connection attempts
  MAX_ATTEMPTS=10
  ATTEMPT=0

  # Try to connect to MySQL until successful or max attempts reached
  while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
#      if mysql -h "localhost" -u "root" -p "test" -P "$mysql_port" "CoreManagement" -e "SELECT 1" >/dev/null 2>&1; then
      if mysql -h 127.0.0.1 -u root -ptest -P $mysql_port CoreManagement -e "SELECT 1" > mysql.out 2>&1; then
          echo "Connected to MySQL successfully!"
          break
      else
          echo "Connection attempt failed. Retrying in 2 seconds..."
          sleep 2
          ATTEMPT=$((ATTEMPT+1))
      fi
  done

  if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
      echo "Failed to connect to MySQL after $MAX_ATTEMPTS attempts."
      exit 1
  fi
}

mysql_port=$(awk -v min=10000 -v max=20000 'BEGIN{srand(); print int(min+rand()*(max-min+1))}')
sleep 1 # sleeping 1ms so the srand() produces different numbers
redis_port=$(awk -v min=10000 -v max=20000 'BEGIN{srand(); print int(min+rand()*(max-min+1))}')

docker run --cap-add SYS_NICE -e TZ=UTC -e MYSQL_DATABASE=CoreManagement -e MYSQL_ROOT_PASSWORD=test -p$mysql_port:3306 --name core_mysql_test -d mysql:8.0.27
docker run --cap-add SYS_NICE -e TZ=UTC -p$redis_port:6379 --name core_redis_test -d redis:6

export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:$mysql_port/CoreManagement
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=test

checkConnection

# end mysql + redis containers

[[ $# -gt 0 ]] && {
        echo "WARN: Passing Maven options: $@" >&2
}
time \
(./mvnw clean $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="!validation & !find & !controller_common & !controller_v2 & !controller_v3 & !process" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="validation" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="find" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="process" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="controller_common" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="controller_v2" $@ &&
./mvnw -Duser.timezone=UTC test -T 8 -Dspring.test.context.cache.maxSize=20 -Dgroups="controller_v3" $@ &&
./mvnw -DskipTests --fail-fast install $@)

