#!/bin/bash

set -eo pipefail

# Simple build wrapper

ACTION=${1}
OS=${2}
VERSION=${3}

RCP_DIR="./recipes"
PACKER=${PACKER:-packer}

BUILDER=${BUILDER:-qemu}

#
# Init packer
# install plugins
#
initPacker() {
  os=${1}
  ${PACKER} init ${RCP_DIR}/${os}
}

#
# Run the build
# First the "base" image then the provisionned ones
#
run() {
  ${PACKER} build ${PACKER_OPTS} -on-error=abort -var-file="${RCP_DIR}/${OS}/${VERSION}.pkrvars.hcl" -only="base.*.${OS}" "${RCP_DIR}/${OS}/."
  ${PACKER} build ${PACKER_OPTS} -on-error=abort -force -var-file="${RCP_DIR}/${OS}/${VERSION}.pkrvars.hcl" -except="base.*.${OS}" "${RCP_DIR}/${OS}/."
}

#
# Run a specific build
#
run_build() {
  target=${4}
  ${PACKER} build ${PACKER_OPTS} -force \
    -var-file="${RCP_DIR}/${OS}/${VERSION}.pkrvars.hcl" \
    -only="${target}.${BUILDER}.${OS}" \
    "${RCP_DIR}/${OS}/."
}

#
# Run many builds for one OS
#
run_many() {
  targets="${@:4}"
  only=""
  for target in ${targets};do
    only="${only}-only=${target}.${BUILDER}.${OS} "
  done

  ${PACKER} build ${PACKER_OPTS} -force \
    -var-file="${RCP_DIR}/${OS}/${VERSION}.pkrvars.hcl" \
    ${only} \
    "${RCP_DIR}/${OS}/."
}

#
# List what you can build
#
list() {
  echo "You can build : "
  for os in "${RCP_DIR}"/*; do
    echo "  * $(basename "${os}") :"
    cd "${os}" || exit 100
    for vfile in *.pkrvars.hcl; do
      echo "    - ${vfile}" | sed 's/\.pkrvars\.hcl$//'
    done
    cd - >/dev/null 2>&1 || exit 100
  done
  exit 0
}

#
# Run all builds
#
run_all() {
  versions=""
  for os in "${RCP_DIR}"/*; do
    cd "${os}" || exit 100
    for vfile in *.pkrvars.hcl; do
      versions="${versions} $(echo "${vfile}" | sed 's/\.auto\.pkrvars\.hcl$//')"
    done
    OS=$(basename ${os})
    cd - >/dev/null 2>&1 || exit 100
    for ver in ${versions}; do
      VERSION=${ver}
      run
    done
    versions=""
  done
  set +x
}

#
# Start only ONE build
#
start_build() {
  if [ -z "${OS}" ]; then
    echo "OS Name is missing !"
    echo "  Supported OS are :"
    printf "    "
    ls ${RCP_DIR}
    exit 1
  fi

  if [ -z "${VERSION}" ]; then
    echo "OS Version is missing !"
    echo "   ex: ./build debian 10"
    exit 2
  fi
  run
}

case "${ACTION}" in

  "list")
    list
    ;;

  "all")
    initPacker "${2}" || exit 1
    run_all
    exit ${?}
    ;;

  "start")
    initPacker "${2}" || exit 1
    start_build
    ;;

  "run")
    initPacker "${2}" || exit 1
    run_build $@
    ;;

  "runVMW")
    initPacker "${2}" || exit 1
    run_build $@
    ;;
  
  "mrun")
    initPacker "${2}" || exit 1
    run_many $@
    ;;

  *)
    echo "You need to provide a valid action!"
    echo "  Supported actions are:"
    echo "   - start  "
    echo "   - list "
    echo "   - all"
    echo "   - run"
    exit 1
    ;;
esac