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

if [[ $# -ne 1 ]]; then
  echo "usage: $0 <pre-activate|post-activate>" >&2
  exit 2
fi

phase=$1
case "$phase" in
  pre-activate|post-activate) ;;
  *)
    echo "unknown release hook phase: $phase" >&2
    exit 2
    ;;
esac
export RELEASE_HOOK_PHASE="$phase"

: "${RELEASE_HOOK_SERVICE_NAME:?RELEASE_HOOK_SERVICE_NAME is required}"
: "${RELEASE_HOOK_INSTALL_ROOT:?RELEASE_HOOK_INSTALL_ROOT is required}"
: "${RELEASE_HOOK_RELEASE_DIR:?RELEASE_HOOK_RELEASE_DIR is required}"
: "${RELEASE_HOOK_RELEASE_ID:?RELEASE_HOOK_RELEASE_ID is required}"
: "${RELEASE_HOOK_BUN_BIN:?RELEASE_HOOK_BUN_BIN is required}"
: "${RELEASE_HOOK_ENV_FILE:?RELEASE_HOOK_ENV_FILE is required}"
: "${RELEASE_HOOK_WORKER_ENABLED:?RELEASE_HOOK_WORKER_ENABLED is required}"

script_path=$(realpath "${BASH_SOURCE[0]}")
script_dir=$(dirname "$script_path")
hooks_dir="$script_dir/release-hooks/$phase.d"

[[ -d "$hooks_dir" ]] || exit 0

shopt -s nullglob dotglob
hooks=("$hooks_dir"/*)
for hook in "${hooks[@]}"; do
  hook_name=$(basename "$hook")
  if [[ ! $hook_name =~ ^[0-9]{3}-[a-z0-9][a-z0-9._-]*\.sh$ ]]; then
    echo "invalid release hook name: $hook_name" >&2
    exit 2
  fi
  if [[ ! -f $hook || -L $hook || ! -x $hook ]]; then
    echo "release hook must be a regular executable file: $hook_name" >&2
    exit 2
  fi

  printf 'release-hook phase=%s script=%s status=running\n' "$phase" "$hook_name"
  "$hook"
  printf 'release-hook phase=%s script=%s status=complete\n' "$phase" "$hook_name"
done
