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

PREVIOUS_RELEASE="${1:-}"
BASE="${2:-${STAGING_RELEASE_DIRECTORY:-/srv/geneacase}}"
PHP_BIN="${PHP_BIN:-php}"

if [[ "${ROLLBACK_CONFIRM:-}" != "YES" ]]; then
  echo "[ERROR] Defina ROLLBACK_CONFIRM=YES para confirmar el rollback de código." >&2
  exit 1
fi
if [[ -z "$PREVIOUS_RELEASE" || ! "$PREVIOUS_RELEASE" =~ ^[A-Za-z0-9._-]{1,80}$ ]]; then
  echo "[ERROR] Indique un identificador de release anterior válido." >&2
  exit 1
fi
TARGET="$BASE/releases/$PREVIOUS_RELEASE"
if [[ ! -d "$TARGET" || ! -f "$TARGET/DEPLOYMENT_MANIFEST.json" ]]; then
  echo "[ERROR] El release anterior no existe o no es válido: $TARGET" >&2
  exit 1
fi

"$PHP_BIN" "$TARGET/tools/staging/verify_release.php" "$TARGET"
CURRENT_TARGET="$(readlink -f "$BASE/current" 2>/dev/null || true)"
if [[ -z "$CURRENT_TARGET" || ! -d "$CURRENT_TARGET" ]]; then
  echo "[ERROR] No se pudo resolver el release actual." >&2
  exit 1
fi

ln -sfn "$TARGET" "$BASE/current.next"
mv -Tf "$BASE/current.next" "$BASE/current"

if [[ -f "$BASE/shared/.env" ]]; then
  set -a
  # shellcheck disable=SC1090
  source "$BASE/shared/.env"
  set +a
fi
if [[ -n "${STAGING_BASE_URL:-}" ]]; then
  if ! "$TARGET/deploy/scripts/smoke-test.sh" "$STAGING_BASE_URL"; then
    echo "[ERROR] El release anterior no superó smoke; se repone el release original." >&2
    ln -sfn "$CURRENT_TARGET" "$BASE/current.next"
    mv -Tf "$BASE/current.next" "$BASE/current"
    exit 1
  fi
fi

echo "[OK] Rollback de código completado: $PREVIOUS_RELEASE"
echo "[INFO] La base de datos no fue restaurada automáticamente."
echo "BASE_DE_DATOS_RESTAURADA=NO"
