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

if [[ $# -ne 2 ]]; then
  echo "usage: rollback-release.sh TARGET_DIR RELEASE_ID" >&2
  exit 64
fi

target_dir=$(readlink -m "$1")
release_id=$2
releases_root=$(readlink -m "${target_dir}/releases")
release_path=$(readlink -m "${releases_root}/${release_id}")
current_path="${target_dir}/current"

[[ "$release_id" =~ ^[0-9a-f]{7,40}$ ]] || { echo "invalid release id" >&2; exit 65; }
[[ "$release_path" == "${releases_root}/"* && "$release_path" != "$releases_root" ]] || { echo "release escapes releases" >&2; exit 66; }
if [[ -e "$current_path" && ! -L "$current_path" ]]; then echo "current must be a symlink" >&2; exit 67; fi
[[ -d "$release_path" && -f "${release_path}/.release-ready" ]] || { echo "rollback release not ready" >&2; exit 68; }
[[ -f "${release_path}/backend/vendor/autoload.php" && -f "${release_path}/backend/public/index.php" && -f "${release_path}/backend/public/app/index.html" ]] || { echo "rollback release incomplete" >&2; exit 68; }

temporary_link="${target_dir}/.current.rollback.${release_id}.$$"
ln -s "releases/${release_id}" "$temporary_link"
mv -Tf "$temporary_link" "$current_path"
echo "rolled back to ${release_id}"
