#!/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="RAW_PATCH_ANALYSIS"
OP=""
TEMPDIR=""
REPORTDIR=""
SUMMARYFILE=""
PATCHFILE=""

###############################################################################
cleanupAndExit() {
  exit "$1"
}
###############################################################################
printUsage() {
  echo "Usage: $0 --taskname | (--op=pre|post|report --tempdir=<TEMP DIR> --reportdir=<REPORT DIR> --summaryfile=<SUMMARY FILE> "
  echo "--patchfile=<PATCH FILE>)"
  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#*=}
      ;;
    --patchfile=*)
      PATCHFILE=${i#*=}
      ;;
    esac
  done
  if [[ "${TASKNAME}" == "" || "${OP}" == "" || "${TEMPDIR}" == "" || "${REPORTDIR}" == "" || "${SUMMARYFILE}" == "" || "${PATCHFILE}" == "" ]] ; 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
}
###############################################################################
checkNoAuthors() {
  authorTags=$(grep "^+" "${PATCHFILE}" | grep -v "^+++" | grep -c -i -e ".*\*.* @author")
  if [[ ${authorTags} != 0 ]] ; then
    REPORT+=("{color:red}-1{color} the patch seems to contain ${authorTags} line(s) with @author tags")
  else
    REPORT+=("{color:green}+1{color} the patch does not introduce any @author tags")
  fi
}
###############################################################################
checkNoTabs() {
  tabs=$(grep "^+" "${PATCHFILE}" | grep -v "^+++" | grep -c $'\t')
  if [[ ${tabs} != 0 ]] ; then
    REPORT+=("{color:red}-1{color} the patch contains ${tabs} line(s) with tabs")
  else
    REPORT+=("{color:green}+1{color} the patch does not introduce any tabs")
  fi
}
###############################################################################
checkNoTrailingSpaces() {
  trailingSpaces=$(grep "^+" "${PATCHFILE}" | grep -v "^+++" | grep -c -e " $")
  if [[ ${trailingSpaces} != 0 ]] ; then
    REPORT+=("{color:red}-1{color} the patch contains ${trailingSpaces} line(s) with trailing spaces")
  else
    REPORT+=("{color:green}+1{color} the patch does not introduce any trailing spaces")
  fi
}
###############################################################################
checkLinesLength() {
  # We check for > 133 to account for the "+" sign
  longLines=$(grep "^+" "${PATCHFILE}" | grep -v "^+++" | awk 'BEGIN{count=0}{if ( length > 133 ) { count=count+1} }END{ print count}')
  if [[ ${longLines} != 0 ]] ; then
    REPORT+=("{color:red}-1{color} the patch contains ${longLines} line(s) longer than 132 characters")
  else
    REPORT+=("{color:green}+1{color} the patch does not introduce any line longer than 132")
  fi
}
###############################################################################
checkForTestcases() {
  testcases=$(grep -c -i -e '^+++.*/test.*java' "${PATCHFILE}")
  if [[ ${testcases} == 0 ]] ; then
    REPORT+=("{color:red}-1{color} the patch does not add/modify any testcase")
    #reverting for summary +1 calculation
    testcases=1
  else
    REPORT+=("{color:green}+1{color} the patch adds/modifies ${testcases} testcase(s)")
    #reverting for summary +1 calculation
    testcases=0
  fi
}
###############################################################################
checkNoStarImports() {
    starImports=$(grep -c "\+\s*import[a-zA-Z .]*\*" "${PATCHFILE}")
    if [[ ${starImports} != 0 ]] ; then
      REPORT+=("{color:red}-1{color} the patch contains ${starImports} star import(s)")
    else
      REPORT+=("{color:green}+1{color} the patch does not introduce any star imports")
    fi
}
###############################################################################

parseArgs "$@"

case $OP in
  pre)
    ;;
  post)
    ;;
  report)
    REPORT=()
    checkNoAuthors
    checkNoTabs
    checkNoTrailingSpaces
    checkNoStarImports
    checkLinesLength
    checkForTestcases
    total=$((authorTags + tabs + trailingSpaces + longLines + testcases + starImports))
    if [[ $total == 0 ]] ; then
      echo "{color:green}+1 ${TASKNAME}{color}" >> "$SUMMARYFILE"
    else
      echo "{color:red}-1 ${TASKNAME}{color}" >> "$SUMMARYFILE"
    fi
    for line in "${REPORT[@]}" ; do
      echo ".    ${line}" >> "$SUMMARYFILE"
    done
    ;;
esac

exit 0
