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

usage() {
  cat <<'EOF'
usage: release-workflow-dispatch [--mode full|assets|packages|web-sdk|web-sdk-publish] [--version vX.Y.Z] [--backend auto|github-hosted|buildbuddy] [--ref REF] [--web-sdk-artifact-run-id RUN_ID] [--dry-run]

Dispatches the release workflow through the same public/default vs owner-only
BuildBuddy backend split used by CI.

Backend note: release_backend=buildbuddy covers release validation and all
surface binary assets, including Windows. @rkat/web is built once as a release
artifact before npm publishing. Credentialed registry publish jobs still run on
GitHub-hosted runners; use the narrow recovery modes for retries.

Environment equivalents:
  VERSION or RELEASE_TAG     Release tag, for example v0.6.1.
  RELEASE_BACKEND            auto, github-hosted, or buildbuddy. Defaults to auto.
  RELEASE_REF                Workflow ref. Defaults to the tag for full and main for recovery modes.
  REGISTRY_DRY_RUN           true/false for package publish dry-runs.
  WEB_SDK_ARTIFACT_RUN_ID    Existing workflow run id containing rkat-web-package.
  RELEASE_WORKFLOW_DRY_RUN   true/false to print the gh command without dispatching.
  MEERKAT_BUILDBUDDY         When RELEASE_BACKEND=auto, true selects buildbuddy
                              and false/0 selects github-hosted. If unset, auto
                              honors MEERKAT_RELEASE_BUILDBUDDY=true only for
                              the lukacf GitHub account.
EOF
}

mode="${MODE:-full}"
version="${VERSION:-${RELEASE_TAG:-}}"
backend="${RELEASE_BACKEND:-auto}"
workflow_ref="${RELEASE_REF:-}"
web_sdk_artifact_run_id="${WEB_SDK_ARTIFACT_RUN_ID:-}"
case "${RELEASE_WORKFLOW_DRY_RUN:-false}" in
  1|true|TRUE|yes|YES|on|ON) dry_run=1 ;;
  *) dry_run=0 ;;
esac

while [[ $# -gt 0 ]]; do
  case "$1" in
    --mode)
      mode="${2:?--mode requires a value}"
      shift 2
      ;;
    --version|--tag)
      version="${2:?--version requires a value}"
      shift 2
      ;;
    --backend)
      backend="${2:?--backend requires a value}"
      shift 2
      ;;
    --ref)
      workflow_ref="${2:?--ref requires a value}"
      shift 2
      ;;
    --dry-run)
      dry_run=1
      shift
      ;;
    --web-sdk-artifact-run-id)
      web_sdk_artifact_run_id="${2:?--web-sdk-artifact-run-id requires a value}"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "unknown argument: $1" >&2
      usage >&2
      exit 2
      ;;
  esac
done

case "${mode}" in
  full|assets|packages|web-sdk|web-sdk-publish) ;;
  *)
    echo "unknown release mode: ${mode}" >&2
    usage >&2
    exit 2
    ;;
esac

if [[ -z "${version}" ]]; then
  echo "VERSION=vX.Y.Z is required" >&2
  usage >&2
  exit 2
fi

case "${version}" in
  v*) ;;
  *)
    echo "release VERSION must include the v prefix, for example v0.6.1" >&2
    exit 2
    ;;
esac

workspace_root="$(git rev-parse --show-toplevel)"
cd "${workspace_root}"
source "${workspace_root}/scripts/build-backend-env"

repo_release_buildbuddy_enabled() {
  if ! command -v gh >/dev/null 2>&1; then
    return 1
  fi
  local user value
  user="$(gh api user --jq '.login' 2>/dev/null || true)"
  if [[ "${user}" != "lukacf" ]]; then
    return 1
  fi
  value="$(
    gh api repos/lukacf/meerkat/actions/variables/MEERKAT_RELEASE_BUILDBUDDY \
      --jq '.value' 2>/dev/null || true
  )"
  case "${value}" in
    1|true|TRUE|yes|YES|on|ON|buildbuddy)
      return 0
      ;;
    *)
      return 1
      ;;
  esac
}

case "${backend}" in
  auto)
    if [[ -n "${MEERKAT_BUILDBUDDY+x}" ]]; then
      if meerkat_buildbuddy_enabled; then
        backend="buildbuddy"
      else
        backend="github-hosted"
      fi
    elif repo_release_buildbuddy_enabled; then
      backend="buildbuddy"
    else
      backend="github-hosted"
    fi
    ;;
  github-hosted|buildbuddy) ;;
  *)
    echo "unknown release backend: ${backend}" >&2
    usage >&2
    exit 2
    ;;
esac

if [[ -z "${workflow_ref}" ]]; then
  case "${mode}" in
    full) workflow_ref="${version}" ;;
    assets|packages|web-sdk|web-sdk-publish) workflow_ref="main" ;;
  esac
fi

args=(
  gh workflow run release.yml
  --ref "${workflow_ref}"
  -f "release_tag=${version}"
  -f "release_backend=${backend}"
)

case "${mode}" in
  full)
    args+=(
      -f "publish_release_packages=true"
      -f "registry_dry_run=${REGISTRY_DRY_RUN:-false}"
    )
    ;;
  assets)
    args+=(
      -f "publish_release_assets_only=true"
    )
    ;;
  packages)
    args+=(
      -f "publish_release_packages=true"
      -f "registry_dry_run=${REGISTRY_DRY_RUN:-false}"
    )
    ;;
  web-sdk)
    args+=(
      -f "publish_release_packages=true"
      -f "publish_web_sdk_only=true"
      -f "registry_dry_run=${REGISTRY_DRY_RUN:-false}"
    )
    ;;
  web-sdk-publish)
    if [[ -z "${web_sdk_artifact_run_id}" ]]; then
      echo "--web-sdk-artifact-run-id is required for --mode web-sdk-publish" >&2
      exit 2
    fi
    args+=(
      -f "publish_release_packages=true"
      -f "publish_web_sdk_only=true"
      -f "web_sdk_artifact_run_id=${web_sdk_artifact_run_id}"
      -f "registry_dry_run=${REGISTRY_DRY_RUN:-false}"
    )
    ;;
esac

printf 'release workflow backend: %s\n' "${backend}"
printf 'release workflow mode: %s\n' "${mode}"
printf 'release workflow ref: %s\n' "${workflow_ref}"
printf 'release workflow tag: %s\n' "${version}"
if [[ "${backend}" == "buildbuddy" ]]; then
  printf 'release workflow acceleration: BuildBuddy validation + Linux/macOS/Windows binary builds\n'
else
  printf 'release workflow acceleration: GitHub-hosted validation + binary asset builds\n'
fi
case "${mode}" in
  full|packages|web-sdk)
    printf 'release workflow registry publishing: prebuilt Web SDK artifact + GitHub-hosted credentialed publish (use web-sdk/packages recovery for retries)\n'
    ;;
  web-sdk-publish)
    printf 'release workflow registry publishing: existing Web SDK artifact %s + GitHub-hosted credentialed publish\n' "${web_sdk_artifact_run_id}"
    ;;
esac

if [[ "${dry_run}" == "1" ]]; then
  printf 'DRY-RUN '
  printf '%q ' "${args[@]}"
  printf '\n'
  exit 0
fi

if ! command -v gh >/dev/null 2>&1; then
  echo "gh is required to dispatch the release workflow" >&2
  exit 127
fi

exec "${args[@]}"
