#! /usr/bin/env 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
#
#   https://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() {
  echo
  echo "options:"
  echo "-h     Display help"
  echo "-u     SonarQube Host URL"
  echo "-l     SonarQube Login Credentials"
  echo "-k     SonarQube Project Key"
  echo "-n     SonarQube Project Name"
  echo
  echo "Important:"
  echo "    The required parameters for publishing the coverage results to SonarQube:"
  echo "      - Host URL"
  echo "      - Login Credentials"
  echo "      - Project Key"
  echo
}

execute() {
  SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
  MAIN_POM="$SCRIPT_DIR/../../pom.xml"

  mvn -B -e -Pclover -f "$MAIN_POM" clean install -DskipTests -DskipShade

  mvn -B -e -Pclover -f "$MAIN_POM" test -Dparallel-tests -DtestsThreadCount=8 -Dscale

  mvn -B -e -Pclover -f "$MAIN_POM" clover:aggregate clover:clover

  # If the required parameters are given, the code coverage results are uploaded to the SonarQube Server
  if [[ -n $SONAR_LOGIN ]] && [[ -n $SONAR_PROJECT_KEY ]] && [[ -n $SONAR_URL ]]; then
    mvn -B -e -Pclover -f "$MAIN_POM" sonar:sonar -Dsonar.clover.reportPath=./target/clover/clover.xml \
      -Dsonar.host.url="$SONAR_URL" -Dsonar.login="$SONAR_LOGIN" -Dsonar.projectKey="$SONAR_PROJECT_KEY" -Dsonar.projectName="$SONAR_PROJECT_NAME"
  fi
}

while getopts ":u:l:k:n:h" option; do
  case $option in
    u) SONAR_URL=${OPTARG:-} ;;
    l) SONAR_LOGIN=${OPTARG:-} ;;
    k) SONAR_PROJECT_KEY=${OPTARG:-} ;;
    n) SONAR_PROJECT_NAME=${OPTARG:-} ;;
    h) # Display usage
      usage
      exit
      ;;
    \?) # Invalid option
      echo "Error: Invalid option"
      exit
      ;;
  esac
done

# Start code analysis
execute
