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

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

if [[ -z "$RELEASE_ZIP" || ! -f "$RELEASE_ZIP" ]]; then
  echo "[ERROR] Indique el ZIP de release generado por Sprint 25F." >&2
  exit 1
fi
if [[ ! -f "$BASE/shared/.env" ]]; then
  echo "[ERROR] Falta $BASE/shared/.env" >&2
  exit 1
fi

set -a
# shellcheck disable=SC1090
source "$BASE/shared/.env"
set +a
: "${STAGING_BASE_URL:?STAGING_BASE_URL requerido para smoke posterior}"
if [[ "$STAGING_BASE_URL" != https://* ]]; then
  echo "[ERROR] STAGING_BASE_URL debe usar HTTPS." >&2
  exit 1
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CURRENT_TARGET="$(readlink -f "$BASE/current" 2>/dev/null || true)"
"$SCRIPT_DIR/backup-database.sh" "$BASE"

TMP="$(mktemp -d)"
cleanup() { rm -rf "$TMP"; }
trap cleanup EXIT
unzip -q "$RELEASE_ZIP" -d "$TMP"
mapfile -t ROOTS < <(find "$TMP" -mindepth 1 -maxdepth 1 -type d)
if [[ "${#ROOTS[@]}" -ne 1 ]]; then
  echo "[ERROR] El ZIP debe contener una única carpeta raíz." >&2
  exit 1
fi
ROOT="${ROOTS[0]}"
if [[ ! -f "$ROOT/DEPLOYMENT_MANIFEST.json" ]]; then
  echo "[ERROR] El ZIP no contiene un release GeneaCase válido." >&2
  exit 1
fi

"$PHP_BIN" "$ROOT/tools/staging/verify_release.php" "$ROOT"
RELEASE_ID="$("$PHP_BIN" -r '$m=json_decode(file_get_contents($argv[1]),true); echo preg_replace("/[^A-Za-z0-9._-]/","-",(string)($m["release"]??""));' "$ROOT/DEPLOYMENT_MANIFEST.json")"
if [[ -z "$RELEASE_ID" ]]; then
  echo "[ERROR] Identificador de release inválido." >&2
  exit 1
fi

TARGET="$BASE/releases/$RELEASE_ID"
if [[ -e "$TARGET" ]]; then
  echo "[ERROR] El release ya existe: $TARGET" >&2
  exit 1
fi
mv "$ROOT" "$TARGET"
ln -s "$BASE/shared/.env" "$TARGET/.env"
rm -rf "$TARGET/storage"
ln -s "$BASE/shared/storage" "$TARGET/storage"

(
  cd "$TARGET"
  if command -v "$COMPOSER_BIN" >/dev/null 2>&1; then
    "$COMPOSER_BIN" install --no-dev --no-interaction --prefer-dist --optimize-autoloader
  else
    echo "[AVISO] Composer no está disponible; se continúa solo si el proyecto no requiere vendor."
  fi
  "$PHP_BIN" cli/geneacase.php migrate
  "$PHP_BIN" tools/staging/preflight.php --strict
)

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

if ! "$TARGET/deploy/scripts/smoke-test.sh" "$STAGING_BASE_URL"; then
  echo "[ERROR] Smoke posterior falló." >&2
  if [[ -n "$CURRENT_TARGET" && -d "$CURRENT_TARGET" ]]; then
    ln -sfn "$CURRENT_TARGET" "$BASE/current.next"
    mv -Tf "$BASE/current.next" "$BASE/current"
    echo "[OK] Rollback automático de código completado." >&2
  fi
  echo "[INFO] La base de datos no se restaura automáticamente." >&2
  exit 1
fi

echo "[OK] Release activado y verificado: $RELEASE_ID"
echo "[OK] Smoke HTTP: APTO"
echo "TRAFICO_PRODUCCION_ACTIVADO=NO"
echo "CARGOS_REALIZADOS=NO"
