#!/bin/bash

TOP_LEVEL=${PWD}

changes_detected=false

folders_with_changes=()

plan_in_folders () {
  env=$1
  printf "Testing %s\n" "${env}"
  for folder in ./"${env}"/*; do
    cd "${TOP_LEVEL}/${folder}" || (printf "\nDirectory %s does not exist\n" "${TOP_LEVEL}/${folder}" && exit 1)
    printf "Running terraform plan in %s\n" "${folder}"
    terraform init || (printf "\nFailed to run terraform init successfully\n" && exit 1)
    # The "-detailed-exitcode" flag means terraform exits with code 2 if the
    # command succeeds, but changes are detected
    terraform plan -detailed-exitcode
    exitcode="${?}"
    printf "Exit code from terraform plan: %s\n" "${exitcode}"
    if [ "${exitcode}" == '2' ]; then
      changes_detected=true
      folders_with_changes+=("${folder}")
    elif [ "${exitcode}" == '1' ]; then
      printf "\nError running terraform plan in %s\n" "${TOP_LEVEL}/${folder}" && exit 1
    fi
    cd "${TOP_LEVEL}" || (printf "\nDirectory %s does not exist\n" "${TOP_LEVEL}" && exit 1)
  done
}

envs=("qa" "prod")

for env in "${envs[@]}"; do
  plan_in_folders "${env}"
done

if [ ${changes_detected} = true ]; then
  printf "Changes have been detected when running terraform in the following folders:\n\n"
  for folder in "${folders_with_changes[@]}"; do
    printf "%s\n" "${folder}";
  done
  exit 1
else
  printf "No changes detected between infrastructure and code in all Terraform configurations!\n"
fi
