#!/usr/bin/env bash
# shellcheck disable=SC2162,SC2046,SC2002,SC2034
set -euo pipefail

#
# GovCMS validate theme yaml files.
#
# Ensure files in the theme directory contain valid YAML.
#

GOVCMS_THEME_FILES=${GOVCMS_THEME_FILES:-}
GOVCMS_YAML_LINT=${GOVCMS_YAML_LINT:-}
GOVCMS_THEME_DIR=${GOVCMS_THEME_DIR:-}
GOVCMS_LINT_EXCLUDE_PATTERN=${GOVCMS_LINT_EXCLUDE_PATTERN:-}
GOVCMS_PREPARE_XML_SCRIPT=${GOVCMS_PREPARE_XML_SCRIPT:-govcms-prepare-xml}
GOVCMS_OUTFILE=${GOVCMS_OUTFILE:-govcms-validate-theme-yml}

FAILURES=""
function join_char { local IFS="$1" shift; echo "$*"; }

echo "GovCMS Validate :: Yaml lint theme files"

if [ -z "${GOVCMS_THEME_DIR}" ]; then
  GOVCMS_THEME_DIR=./web/themes
  if [ ! -d ./web ]; then
    GOVCMS_THEME_DIR=./themes
  fi
fi

if [ -z "${GOVCMS_THEME_FILES}" ]; then
  GOVCMS_THEME_FILES=$(find ${GOVCMS_THEME_DIR} -type f -name "*.yml")
fi

if [ -z "${GOVCMS_YAML_LINT}" ]; then
  GOVCMS_YAML_LINT=govcms-yaml_lint
  if ! command -v "$GOVCMS_YAML_LINT" > /dev/null 2>&1; then
    GOVCMS_YAML_LINT=/app/vendor/bin/govcms-yaml_lint
  fi
fi

if [ -z "${GOVCMS_LINT_EXCLUDE_PATTERN}" ]; then
  GOVCMS_LINT_EXCLUDE_PATTERN="(node_modules)"
fi

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

for file in $GOVCMS_THEME_FILES; do
  if [[ "$file" =~ ${GOVCMS_LINT_EXCLUDE_PATTERN} ]]; then
    echo "[info]: Skip $file"
    continue
  fi

  if ! $GOVCMS_YAML_LINT "$file"; then
    echo "[fail]: $file failed lint";
    FAILURES="$FAILURES,$file"
  fi
done

IFS=$IFS_BAK

if [ -x "${GOVCMS_PREPARE_XML_SCRIPT}" ]; then
  FILE_LFS=$(join_char , "${GOVCMS_THEME_FILES}")
  ${GOVCMS_PREPARE_XML_SCRIPT} --failures="${FAILURES}" --total="${FILE_LFS}" --name="${GOVCMS_OUTFILE}" --fail-message="GovCMS.QA.InvalidThemeYml"
fi

if [ -z "${FAILURES}" ]; then
  echo "[success]: No YAML issues in theme files."
  exit 0
fi

echo "[fail]: YAML issues in theme files."
exit 1
