#!/usr/bin/env bash
#
#   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.

if [ "${TESTPATCHDEBUG}" == "true" ] ; then
  set -x
fi

TASKNAME="JAVADOC"
OP=""
TEMPDIR=""
REPORTDIR=""
SUMMARYFILE=""
MVNPASSTHRU=""

###############################################################################
cleanupAndExit() {
  exit "$1"
}
###############################################################################
printUsage() {
  echo "Usage: $0 --taskname | (--op=pre|post|report --tempdir=<TEMP DIR> --reportdir=<REPORT DIR> --summaryfile=<SUMMARY FILE>) [-D<VALUE>...] [-P<VALUE>...]"
  echo
}
###############################################################################
parseArgs() {
  for i in "$@"
  do
    case $i in
    --taskname)
      echo ${TASKNAME}
      exit 0
      ;;
    --op=*)
      OP=${i#*=}
      ;;
    --tempdir=*)
      TEMPDIR=${i#*=}
      ;;
    --reportdir=*)
      REPORTDIR=${i#*=}
      ;;
    --summaryfile=*)
      SUMMARYFILE=${i#*=}
      ;;
    -D*)
      MVNPASSTHRU="${MVNPASSTHRU} $i"
      ;;
    -P*)
      MVNPASSTHRU="${MVNPASSTHRU} $i"
      ;;
    esac
  done
  if [[ "${TASKNAME}" == "" || "${OP}" == "" || "${TEMPDIR}" == "" || "${REPORTDIR}" == "" || "${SUMMARYFILE}" == "" ]] ; then
    echo "Missing options"
    echo
    printUsage
    cleanupAndExit 1
  fi
  if [[ "${OP}" != "pre" && "${OP}" != "post" && "${OP}" != "report" ]] ; then
    echo "Invalid operation"
    echo
    printUsage
    cleanupAndExit 1
  fi
}
###############################################################################
checkForWarnings() {
  cleanWarns=$(grep '\[WARNING\]' "${REPORTDIR}"/${TASKNAME}-clean.txt | awk '/Javadoc Warnings/,EOF' | grep -c warning )
  patchWarns=$(grep '\[WARNING\]' "${REPORTDIR}"/${TASKNAME}-patch.txt | awk '/Javadoc Warnings/,EOF' | grep -c warning )
  newWarns=$(( patchWarns - cleanWarns))
  if [[ $newWarns -le 0 ]] ; then
    REPORT+=("{color:green}+1{color} the patch does not seem to introduce new Javadoc warning(s)")
    newWarns=0
  else
    REPORT+=("{color:red}-1{color} the patch seems to introduce $newWarns new Javadoc warning(s)")
    newWarns=1
  fi
  if [[ $cleanWarns != 0 ]] ; then
    REPORT+=("{color:orange}WARNING{color}: the current HEAD has $cleanWarns Javadoc warning(s)")
  fi
}
###############################################################################
checkForErrors() {
    exitCode=$(cat "${TEMPDIR}"/${TASKNAME}.exitCode)
  if [[ "$exitCode" == "0" ]] ; then
    REPORT+=("{color:green}+1{color} Javadoc generation succeeded with the patch")
  else
    REPORT+=("{color:red}-1{color} build with Javadoc generation fails with the patch")
  fi
}
###############################################################################

parseArgs "$@"

case $OP in
  pre)
    mvn clean package javadoc:javadoc -DskipTests ${MVNPASSTHRU} > "${REPORTDIR}"/${TASKNAME}-clean.txt
    ;;
  post)
    mvn clean package javadoc:javadoc -DskipTests ${MVNPASSTHRU} > "${REPORTDIR}"/${TASKNAME}-patch.txt
    exitCode=${PIPESTATUS[0]}
    echo "$exitCode" >  "${TEMPDIR}"/${TASKNAME}.exitCode
    ;;
  report)
    checkForErrors
    if [ $exitCode != 0 ] ; then
        echo "{color:red}-1 ${TASKNAME}{color}" >> "$SUMMARYFILE"
    else
        checkForWarnings
        if [ $newWarns -eq 0 ] ; then
            echo "{color:green}+1 ${TASKNAME}{color}" >> "$SUMMARYFILE"
        else
            echo "{color:red}-1 ${TASKNAME}{color}" >> "$SUMMARYFILE"
        fi
    fi
    for line in "${REPORT[@]}" ; do
      echo ".    ${line}" >> "$SUMMARYFILE"
    done
    ;;
esac

exit 0
