#!/usr/bin/env bash
set -xeo pipefail

SELF=$(which "$0"); APP="$1"; TARGET="$2"; FORWARDED_PORT="$3"; SHOULD_FAIL="$4"
REMOTE="dokku@$TARGET"
REPO="test-$(basename "$APP")-$RANDOM"

destroy_app() {
  # shellcheck disable=SC2029
  echo "$REPO" | ssh "$REMOTE" apps:destroy "$REPO"
}

failed() {
  echo "************ $1 failed ************"
  destroy_app
  exit 1
}

succeeded() {
  echo "************ $1 succeeded but should have failed ************"
  destroy_app
  exit 1
}

TMP=$(mktemp -d "/tmp/$TARGET.XXXXX")
rmdir "$TMP" && cp -r "$(dirname "$SELF")/$APP" "$TMP"

pushd "$TMP" &> /dev/null || exit 1
trap 'popd &> /dev/null || true; rm -rf "$TMP"' INT TERM EXIT

git init
git config user.email "robot@example.com"
git config user.name "Test Robot"
git remote add target "${REMOTE}:${REPO}"

[[ -f gitignore ]] && mv gitignore .gitignore
git add .

[[ -x pre-commit ]] && ./pre-commit "$REMOTE" "$REPO"
git commit -m 'initial commit'
if [[ "$SHOULD_FAIL" == true ]]; then
  git push target master && succeeded git-push
else
  git push target master || failed git-push
fi
if [[ -x post-deploy ]]; then
  ./post-deploy "$REMOTE" "$REPO" || failed post-deploy
fi

if [[ "$SHOULD_FAIL" == true ]]; then
  echo "-----> Deploy failed (as it should have)!"
  destroy_app
  exit 0
fi

URL=$(dokku url "$REPO")$FORWARDED_PORT
sleep 2
if (./check_deploy "$URL"); then
  echo "-----> Deploy success!"
else
  sleep 4
  if (./check_deploy "$URL"); then
    echo "-----> Deploy success!"
  else
    failed check-deploy
  fi
fi

destroy_app
