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

BASEDIR=$(pwd)
TASKNAME="CLEAN"
OP=""
TEMPDIR=""
REPORTDIR=""
SUMMARYFILE=""
MVNPASSTHRU=""

###############################################################################
cleanupAndExit() {
    exit $1
}
###############################################################################
printUsage() {
    echo "Usage: $0 --taskname | (--op=pre|post|report --tempdir=<TEMP DIR>) [-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 [[ "${OP}" == "" || "${TEMPDIR}" == "" ]] ; 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
}
###############################################################################


parseArgs "$@"

case $OP in
pre)
    mvn clean ${MVNPASSTHRU} > ${TEMPDIR}/${TASKNAME}.txt
    EXITCODE=$?
    # removing files created by dependency:copy-dependencies
    rm -f */lib/*
    exit $EXITCODE
    ;;
post)
    mvn clean ${MVNPASSTHRU} >> ${TEMPDIR}/${TASKNAME}.txt
    EXITCODE=$?
    ;;
report)
    echo "{color:green}+1 ${TASKNAME}{color}" >> $SUMMARYFILE
    ;;
esac

exit 0
