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

#
# example usage:
#
#     sh build.sh -ptOvI
#

#
# see serve-timeline.sh to serve up the generated website (requires JDK18)
#

BASENAME_0=$(basename $0)

usage() {
 echo ""                                                                                               >&2
 echo "$BASENAME_0 options:"                                                                           >&2
 echo ""                                                                                               >&2
 echo "  -C run 'git clean -dfx first"                                                                 >&2
 echo "  -H run 'git reset --hard origin/<branchname>' first"                                          >&2
 echo "  -p run 'git pull --ff-only' first"                                                            >&2
 echo "  -c include 'clean' goal"                                                                      >&2
 echo "  -O do NOT add '-o' (offline) flag, ie bring down any new dependencies"                        >&2
 echo "  -t skip tests"                                                                                >&2
 echo "  -l single threaded, do NOT add '-T1C' flag"                                                   >&2
 echo "  -k use 'package' rather than 'install'.  Does not run integ tests.  Cannot combine with '-y'" >&2
 echo "  -y use 'verify' rather than 'install'.  Cannot combine with '-k'"                             >&2
 echo "  -a append '-Dmodule-all'.  Cannot combine with '-I' or '-K'"                                  >&2
 echo "  -K append '-Dmodule-all-except-kroviz'.  Cannot combine with '-a' or '-I'"                    >&2
 echo "  -I append '-Dmodule-all-except-incubator'.  Cannot combine with '-a' or '-K'"                 >&2
 echo "  -d use mvnd rather than mvn (requires: mvndaemon)"                                            >&2
 echo "  -n serve up timeline afterwards (prereq: npm i -g serve)"                                     >&2
 echo "  -F do NOT search for Failures and Errors at the end"                                          >&2
 echo "  -S do NOT print summary or last 50 lines at the end"                                          >&2
 echo "  -w whatif - don't run the command but do print it out.  Implies -v (verbose)"                 >&2
 echo "  -v verbose"                                                                                   >&2
 echo "  -e edit log file at end.  Cannot combine with '-v'"                                           >&2
 echo ""                                                                                               >&2
 echo ""                                                                                               >&2
 echo "example usage:"                                                                                 >&2
 echo ""                                                                                               >&2
 echo "sh build.sh -tOd           # no tests, no offline, use mvnd, released only"                     >&2
 echo "sh build.sh -ptOdI         # pull, no tests, no offline, use mvnd, no incubator"                >&2
 echo "sh build.sh -pctOvI        # pull, clean, no tests, no offline, verbose, no incubator"          >&2
 echo "sh build.sh -CHOdI         # fetch, clean and reset, no offline, use mvnd, no incubator"         >&2
 echo ""                                                                                               >&2
}

GIT_CLEAN_HARD=false
GIT_RESET_HARD=false
GIT_PULL=false
CLEAN=false
SKIP_TESTS=false
SKIP_OFFLINE=false
PACKAGE_ONLY=false
VERIFY_ONLY=false
TIMELINE=false
WHATIF=false
SINGLE_THREADED=false
ALL=false
ALL_EXCEPT_KROVIZ=false
ALL_EXCEPT_INCUBATOR=false
USE_MVND=false
SKIP_SEARCH_FOR_FAILURES=false
SKIP_SUMMARY=false
EDIT=false
VERBOSE=false

MVN_LOG=/tmp/$BASENAME_0.$$.log

while getopts 'CHprcntlkyaIKOdFSwveh' opt
do
  case $opt in
    C) GIT_CLEAN_HARD=true ;;
    H) GIT_RESET_HARD=true ;;
    p) GIT_PULL=true ;;
    c) CLEAN=true ;;
    O) SKIP_OFFLINE=true ;;
    l) SINGLE_THREADED=true ;;
    t) SKIP_TESTS=true ;;
    k) PACKAGE_ONLY=true ;;
    y) VERIFY_ONLY=true ;;
    a) ALL=true ;;
    I) ALL_EXCEPT_INCUBATOR=true ;;
    K) ALL_EXCEPT_KROVIZ=true ;;
    n) TIMELINE=true ;;
    d) USE_MVND=true ;;
    F) SKIP_SEARCH_FOR_FAILURES=true ;;
    S) SKIP_SUMMARY=true ;;
    w) WHATIF=true ;;
    v) VERBOSE=true ;;
    e) EDIT=true ;;
    h) usage
       exit 1
       ;;
    *) echo "unknown option $opt - aborting" >&2
       usage
       exit 1
      ;;
  esac
done

shift $((OPTIND-1))

echo ""

if [ "$VERBOSE" = "true" ]; then
  echo "-C (git clean -dfx)                     : $GIT_CLEAN_HARD"
  echo "-H (git reset --hard)                   : $GIT_RESET_HARD"
  echo "-p (git pull --ff-only)                 : $GIT_PULL"
  echo "-c mvn clean                            : $CLEAN"
  echo "-t skip all tests (mvn -DskipTests)     : $SKIP_TESTS"
  echo "-O not mvn --offline                    : $SKIP_OFFLINE"
  echo "-l not mvn -T1C                         : $SINGLE_THREADED"
  echo "-k mvn package                          : $PACKAGE_ONLY"
  echo "-y mvn verify                           : $VERIFY_ONLY"
  echo "-a include ALL modules                  : $ALL"
  echo "-I include all modules except incubator : $ALL_EXCEPT_INCUBATOR"
  echo "-K include all modules except kroviz    : $ALL_EXCEPT_KROVIZ"
  echo "-d use mvnd rather than mvn             : $USE_MVND"
  echo "-n serve up timeline                    : $TIMELINE"
  echo "-F skip search for failures             : $SKIP_SEARCH_FOR_FAILURES"
  echo "-S skip summary                         : $SKIP_SUMMARY"
  echo "-w what-if                              : $WHATIF"
  echo "-v verbose                              : $VERBOSE"
  echo ""
fi

if [ "$PACKAGE_ONLY" = "true" ] && [ "$VERIFY_ONLY" = "true" ]; then
  echo "$BASENAME_0 : cannot use '-y' and '-k' flags together"  >&2
  usage
  exit 1
fi

if [ "$ALL" = "true" ] && [ "$ALL_EXCEPT_INCUBATOR" = "true" ]; then
  echo "$BASENAME_0 : cannot use '-a' and '-I' flags together"  >&2
  usage
  exit 1
fi

if [ "$ALL" = "true" ] && [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
  echo "$BASENAME_0 : cannot use '-a' and '-K' flags together"  >&2
  usage
  exit 1
fi

if [ "$ALL_EXCEPT_INCUBATOR" = "true" ] && [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
  echo "$BASENAME_0 : cannot use '-I' and '-K' flags together"  >&2
  usage
  exit 1
fi

if [ "$VERBOSE" = "true" ] && [ "$EDIT" = "true" ]; then
  echo "$BASENAME_0 : cannot use '-v' and '-e' flags together"  >&2
  usage
  exit 1
fi


OPTS=""

if [ "$CLEAN" = "true" ]; then
  OPTS="$OPTS clean"
fi

if [ "$SKIP_TESTS" = "true" ]; then
  OPTS="$OPTS -DskipTests=true"
fi

if [ "$ALL" = "true" ]; then
  OPTS="$OPTS -Dmodule-all"
fi

if [ "$ALL_EXCEPT_INCUBATOR" = "true" ]; then
  OPTS="$OPTS -Dmodule-all-except-incubator"
fi

if [ "$ALL_EXCEPT_KROVIZ" = "true" ]; then
  OPTS="$OPTS -Dmodule-all-except-kroviz"
fi

if [ "$SKIP_OFFLINE" = "false" ]; then
  OPTS="$OPTS -o"
fi

if [ "$SINGLE_THREADED" = "false" ]; then
  OPTS="$OPTS -T1C"
fi

if [ "$PACKAGE_ONLY" = "true" ]; then
  OPTS="$OPTS package"
else
  if [ "$VERIFY_ONLY" = "true" ]; then
    OPTS="$OPTS verify"
  else
    OPTS="$OPTS install"
  fi
fi

if [ "$USE_MVND" = "true" ]; then
  CMD="mvnd"
else
  CMD="mvn"
fi

CURRENT_BRANCH=$(git branch --show-current)

if [ "$WHATIF" = "true" ]; then

  echo git fetch

  if [ "$GIT_CLEAN_HARD" = "true" ]; then
    echo git clean -dfx
  fi

  if [ "$GIT_RESET_HARD" = "true" ]; then
    echo git reset --hard origin/$CURRENT_BRANCH
  fi

  if [ "$GIT_PULL" = "true" ]; then
    echo git pull --ff-only
  fi

  if [ "$VERBOSE" = "true" ]; then
    echo "$CMD $OPTS $* 2>&1 | tee $MVN_LOG "
  else
    OPTS="$OPTS --log-file $MVN_LOG"
    echo $CMD $OPTS "$@"
  fi


  if [ "$SKIP_SEARCH_FOR_FAILURES" = "false" ]; then
    echo "... grep for failures/errors"
  fi

  if [ "$SKIP_SUMMARY" = "false" ]; then
    echo "... print summary"
  fi

  if [ "$TIMELINE" = "true" ]; then
    echo "serve -d target/timeline"
  fi

  echo ""
else

  git fetch
  if [ $? -ne 0 ]; then
    echo "git fetch failed; aborting" >&2
    exit 1
  fi

  if [ "$GIT_CLEAN_HARD" = "true" ]; then
    git clean -dfx
    if [ $? -ne 0 ]; then
      echo "git clean -dfx failed; aborting" >&2
      exit 1
    fi
  fi

  if [ "$GIT_RESET_HARD" = "true" ]; then
    git reset --hard origin/$CURRENT_BRANCH
    if [ $? -ne 0 ]; then
      echo "git reset --hard origin/$CURRENT_BRANCH failed; aborting" >&2
      exit 1
    fi
  fi

  if [ "$GIT_PULL" = "true" ]; then
    git pull --ff-only
    if [ $? -ne 0 ]; then
      echo "git pull --ff-only failed; aborting" >&2
      exit 1
    fi
  fi

  if [ "$VERBOSE" = "true" ]; then
    echo "$CMD $OPTS $* 2>&1 | tee $MVN_LOG"
    $CMD $OPTS "$@" 2>&1 | tee $MVN_LOG
  else
    OPTS="$OPTS --log-file $MVN_LOG"
    echo "$CMD $OPTS $*"
    $CMD $OPTS "$@"
  fi

  if [ "$SKIP_SEARCH_FOR_FAILURES" = "false" ]; then
    if [ "$VERBOSE" = "true" ]; then
      echo "searching for failures and errors (in $MVN_LOG) ..."
    fi
    grep -in -E 'Failures:\s[1-9]+, Errors: [0-9]+, Skipped: [0-9]+$' -B 20 $MVN_LOG
    grep -in -E 'Failures:\s[0-9]+, Errors: [1-9]+, Skipped: [0-9]+$' -B 20 $MVN_LOG
  else
    if [ "$VERBOSE" = "true" ]; then
      echo "NOT searching for failures and errors"
    fi
  fi

  if [ "$SKIP_SUMMARY" = "false" ]; then
    if [ "$VERBOSE" = "true" ]; then
      echo "printing summary..."
    fi
    if grep -n "Segment walltime" $MVN_LOG ; then
      if [ "$VERBOSE" = "true" ]; then
        echo "found 'Segment walltime' ......"
      fi
      tail -n +$(grep -n "Segment walltime" $MVN_LOG | cut -f1 -d:) $MVN_LOG
    else
      if [ "$VERBOSE" = "true" ]; then
        echo "did NOT find 'Segment walltime', so printing last 120 lines of log"
      fi
      tail -n 120 $MVN_LOG
    fi
  else
    if [ "$VERBOSE" = "true" ]; then
      echo "NOT printing any summary"
    fi
  fi

  if [ "$EDIT" = "true" ]; then
    vi $MVN_LOG
  fi

  if [ "$TIMELINE" = "true" ]; then

    ## when we eventually target only jdk18 and above, then can replace with:
    ## jwebserver -d $(pwd)/target/timeline -b ::

    serve -d target/timeline
  fi

fi


