#!/usr/bin/env bash
set -e

# mithril app builder
# (c) rodolfo lp 2019
# network required for closure compiler

function aggregate() {

  echo "👉 Aggregating folder ${1} recursively"
  # Create Aggregated Libraries
  for filename in ${1}/**/*.js; do

    if [[ -f ${filename} ]]; then

      FILEFOLDER="$(
        cd "$(dirname "$filename")" >/dev/null 2>&1
        pwd -P
      )"

      PARENTFOLDER=$(basename "$FILEFOLDER")

      fname=$(basename "$filename")
      fname="${fname%.*}"

      if [[ "${fname}" == "main" && ${PARENTFOLDER} == "src" ]]; then
        echo "- main is handled separately"
      else
        echo "- Adding module ${fname} from ${PARENTFOLDER}"

        cat "${filename}" >>"$BUILDDIR/${BUILDTYPE}.js"

        echo >>"${BUILDDIR}/${BUILDTYPE}.js"

      fi
      i=$((i + 1))

    else
      echo "- No third party libraries found in ${PROJLIB}."
    fi
  done
}

function aggregateStyle() {

  FILESTRING=$(eval echo "${1}/*.css")
  FILES=($FILESTRING)

  echo "👉 Aggregating styles in $1"

  for filename in "${FILES[@]}"; do
    if [[ -f $filename ]]; then
      fname=$(basename "$filename")
      fname="${fname%.*}"
      echo "- including ${BUILDTYPE} ${NAME} style [${fname}]"
      cat "${filename}" >>"${BUILDDIR}/${BUILDTYPE}.css"
    fi
  done
}

if [[ ! -d "${TEMPDEST}" ]]; then
  echo "! Init script not executed."
  exit 6
fi

if [[ -z "${BUILDDIR}" ]]; then
  echo "! Init script not executed."
  exit 7
fi

# For using recursive directory search(requires bash v4+)
shopt -s globstar

PROJROOT=${SOURCEROOT}/${NAME}
PROJSRC=${PROJROOT}/src
PROJLIB=${PROJROOT}/lib
PROJRAW=${PROJROOT}/raw

echo "- PROJSRC IS ${PROJSRC}"
[[ -d ${PROJSRC} ]] || {
  echo "! No source files found in ${PROJSRC}"
  exit 200
}

#####

echo "-----------------"
echo "Phase 1/4: Aggregate and create ${BUILDTYPE}${BUILDFLAV} Closure"
cp "${TOOLROOT}/build/make-src/${BUILDTYPE}${BUILDFLAV}-closure.in.jst" "${BUILDDIR}/${BUILDTYPE}.js" || exit 100
cat "${TOOLROOT}/build/make-src/template.module.js" >>"${BUILDDIR}/${BUILDTYPE}.js" || exit 100



if [[ -f ${PROJSRC}/main.js.in ]]; then
  echo "- Using custom in closure ${PROJSRC}/main.js.in"
  cat "${PROJSRC}/main.js.in" >>"${BUILDDIR}/${BUILDTYPE}.js"
else
  echo "- No in closure in ${PROJSRC}/main.js.in"
fi

i="0"

aggregate "${PROJLIB}"

aggregate "${PROJSRC}"

if [[ -f ${PROJSRC}/main.js ]]; then
  echo "- Using Custom Application Entry Point"
  MAINFILE=${PROJSRC}/main.js
else
  echo "! No Entry Point, please create main.js in ${PROJSRC} if needed"
fi

if [[ -n "${MAINFILE}" ]]; then
  cat "${MAINFILE}" >>"${BUILDDIR}/${BUILDTYPE}.js"
fi

if [[ -f ${PROJSRC}/main.js.out ]]; then
  echo "- Using custom out closure"
  cat "${PROJSRC}/main.js.out" >>"${BUILDDIR}/${BUILDTYPE}.js"
else
  echo "- No out closure in ${PROJSRC}/main.js.out"
fi

cat "${TOOLROOT}/build/make-src/${BUILDTYPE}${BUILDFLAV}-closure.out.jst" >>"${BUILDDIR}/${BUILDTYPE}.js"

aggregate "${PROJSRC}"

cp "${BUILDDIR}/${BUILDTYPE}.js" "${BUILDDIR}/${BUILDTYPE}.rx.js"

if [[ ! -f "${BUILDDIR}/${BUILDTYPE}.rx.js" ]]; then
  echo "! failed to create ${BUILDDIR}/${BUILDTYPE}.rx.js"
  exit 99
fi

# need to turn off uselessCode as it complains when re-minifying mithril.js
npx google-closure-compiler ${CCMODE} --jscomp_off uselessCode --jscomp_off suspiciousCode --js="${BUILDDIR}/${BUILDTYPE}.rx.js" --js_output_file="${TEMPDEST}/${BUILDTYPE}.js"

if [[ "${DEBUG}" == "yes" ]]; then
  cp "${BUILDDIR}/${BUILDTYPE}.rx.js" "${TEMPDEST}/${BUILDTYPE}.debug.js"
fi
echo "-----------------"
echo "Phase 3/4: Compile  ${BUILDTYPE} ${NAME} Styles"

# copy main module styles
aggregateStyle "${PROJROOT}/css"
aggregateStyle "${PROJROOT}/css/**"

# copy section styles
aggregateStyle "${PROJSRC}/**/css"

# cp "${BUILDDIR}/${BUILDTYPE}.css"  "${TEMPDEST}/${BUILDTYPE}.css"

if [[ -f "${BUILDDIR}/${BUILDTYPE}.css" ]]; then
  echo "- Minifying styles nd"
  echo "${NODEMODULES}/.bin/uglifycss" "${BUILDDIR}/${BUILDTYPE}.css"
  "${NODEMODULES}/.bin/uglifycss" "${BUILDDIR}/${BUILDTYPE}.css" >"${TEMPDEST}/${BUILDTYPE}.css"
fi

echo "-----------------"
echo "Phase 4/4: Copying ${BUILDTYPE} ${NAME} Assets"


if [[ -d "${PROJROOT}/assets" ]]; then
  cp -r ${PROJROOT}/assets/* "${TEMPDEST}/" 2>/dev/null || echo "- ${BUILDTYPE} ${NAME} does not provide additional assets"
else
  echo "- ${BUILDTYPE} ${NAME} does not provide additional assets"
fi

echo "-----------------"
echo "${BUILDTYPE} ${NAME}: Build Finished."
echo "✅  Generated files in ${TEMPDEST}"

if [[ -d ${BUILDDIR} && -z ${KEEP} ]]; then
  rm -rf "${BUILDDIR}"
fi
