#!/bin/bash

set -e

: ${AWS_ACCESS_KEY_ID:?}
: ${AWS_SECRET_ACCESS_KEY:?}
: ${AWS_DEFAULT_REGION:=us-west-1}
: ${PROJECT_RUBY_VERSION:?}
: ${BOSH_AWS_KMS_KEY_ARN:?}
: ${BOSH_AWS_KMS_KEY_ARN_OVERRIDE:?}

function destroy_env() {
  pushd "${RELEASE_DIR}/ci/assets/terraform"
    terraform init --input=false
    terraform destroy -force -state="${STATE_FILE}" \
      -var "access_key=${AWS_ACCESS_KEY_ID}" \
      -var "secret_key=${AWS_SECRET_ACCESS_KEY}" \
      ${AWS_SESSION_TOKEN:+-var "session_token=${AWS_SESSION_TOKEN}"} \
      -var "region=${AWS_DEFAULT_REGION}" \
      -var "env_name=$(hostname -s|tr '[:upper:]' '[:lower:]')-local-int" \
      -var "public_key=${PUBLIC_KEY}"
  popd
}

function create_env() {
  pushd "${RELEASE_DIR}/ci/assets/terraform"
    terraform init --input=false
    terraform apply -state="${STATE_FILE}" \
      -auto-approve \
      -var "access_key=${AWS_ACCESS_KEY_ID}" \
      -var "secret_key=${AWS_SECRET_ACCESS_KEY}" \
      ${AWS_SESSION_TOKEN:+-var "session_token=${AWS_SESSION_TOKEN}"} \
      -var "region=${AWS_DEFAULT_REGION}" \
      -var "env_name=$(hostname -s|tr '[:upper:]' '[:lower:]')-local-int" \
      -var "public_key=${PUBLIC_KEY}"
  popd

  jq -e --raw-output '.modules[0].outputs | map_values(.value)' "$STATE_FILE" > $METADATA_FILE
}

export AWS_DEFAULT_REGION
export STATE_FILE=/tmp/integration-terraform-state-"${AWS_DEFAULT_REGION}".tfstate
export METADATA_FILE=/tmp/integration-terraform-metadata.$$.json
if [[ ! -f /tmp/integration-key ]]; then
  ssh-keygen -t rsa -f /tmp/integration-key -N "" -C $(hostname -s)
fi
echo "Generated /tmp/integration-key and /tmp/integration-key.pub successfully."
export PUBLIC_KEY="$(cat /tmp/integration-key.pub)"

echo "###################################################################################"
echo "Applying terraform. Metadata file at $METADATA_FILE"
echo "###################################################################################"

option=$1
if [[ "$option" = "destroy" ]]; then
    destroy_env
    exit
fi
echo "  Note: You can also use the command 'destroy' to destroy a previously created environment."

# make sure correct ruby version is installed
pushd $SRC_DIR
  . bin/check-ruby-version
popd

create_env
${RELEASE_DIR}/ci/tasks/run-integration.sh

if [[ "$option" = "keep-alive" ]]; then
  exit
fi
destroy_env
