#!/usr/bin/env bash
IFS=$'\n\t'
set -euo pipefail

APP_DIR="${APP_DIR:-/app}"
GOVCMS_VALIDATE_ALLOW_FAILURES="${GOVCMS_VALIDATE_ALLOW_FAILURES:-}"
ALLOW_FAILURES=''
NO_INTERACTION=0
DISABLE_ACTIVE=0
STATUS=0

while getopts ":naf:" opt; do
  case $opt in
    n ) NO_INTERACTION=1;;
    f ) ALLOW_FAILURES="$OPTARG";;
    a ) DISABLE_ACTIVE=1;;
    \? )
      echo "GovCMS Ship Shape usage:"
      echo "  -f            List of scripts to allow failures in"
      echo "  -a            Disable 'active' validations"
      echo "  -n            No-interaction, skip output files and fail on error"
      exit 1
      ;;
  esac
done

if [[ -n $GOVCMS_VALIDATE_ALLOW_FAILURES ]]; then
  # This will allow projects to set a deployment variable to control
  # which scripts can be skipped during the deployment process.
  ALLOW_FAILURES="$GOVCMS_VALIDATE_ALLOW_FAILURES"
fi

SCRIPT_DIR=${APP_DIR}/vendor/bin

if [[ $DISABLE_ACTIVE -eq 0 ]]; then
  GOVCMS_VALIDATE_SCRIPTS=$(find "$SCRIPT_DIR" -type l -name "govcms-validate-*")
else
  GOVCMS_VALIDATE_SCRIPTS=$(find "$SCRIPT_DIR" -type l \( -name "govcms-validate-*" ! -name "*active*" \))
fi

XML_SCRIPT=$SCRIPT_DIR/govcms-prepare-xml
SCRIPT_WAS_EXEC=1

if [ ! -x "${XML_SCRIPT}" ]; then
  SCRIPT_WAS_EXEC=0
  chmod +x "${XML_SCRIPT}"
fi

IFS_BAK="$IFS"
IFS=$'\n'

for file in $GOVCMS_VALIDATE_SCRIPTS; do
  echo "Executing ${file}..."
  if [[ $NO_INTERACTION -eq 0 ]]; then
    GOVCMS_PREPARE_XML_SCRIPT=${XML_SCRIPT} $file || true
  else
    FN="${file##*/}"
    if [[ "$ALLOW_FAILURES" =~ $FN ]]; then
      $file || true
    else
      if ! $file;  then
        ((STATUS=STATUS+1))
      fi
    fi
  fi
done

IFS=$IFS_BAK

if [ ${SCRIPT_WAS_EXEC} -eq 0 ]; then
  chmod -x "${XML_SCRIPT}"
fi

# Move reports into specific directory.
if [[ $NO_INTERACTION -eq 0 ]]; then
  mkdir -p "${APP_DIR}"/.ship-shape
  mv "${APP_DIR}"/govcms-*.xml "${APP_DIR}"/.ship-shape/
else
  exit "$STATUS"
fi
