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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# shellcheck source=scripts/release/lib/common.sh
source "$SCRIPT_DIR/release/lib/common.sh"
# shellcheck source=scripts/release/lib/ssh_target_map.sh
source "$SCRIPT_DIR/release/lib/ssh_target_map.sh"

# ==== FILE METADATA ====
if [ ! -f "out/release_meta.env" ]; then
  echo "ERROR: out/release_meta.env non trovato"
  exit 1
fi

source out/release_meta.env

: "${RELEASE_ID:?RELEASE_ID non presente in metadata}"
: "${ARCHIVE_NAME:?ARCHIVE_NAME non presente in metadata}"
: "${CLIENT:?CLIENT non presente in metadata}"
: "${ENV:?ENV non presente in metadata}"
: "${RELEASE_MODE:?RELEASE_MODE non presente in metadata}"

if [[ "$RELEASE_MODE" == "ZIP" ]]; then
  log "RELEASE_MODE=ZIP: nessun deploy remoto richiesto"
  log "Artifact pronto in out/$ARCHIVE_NAME"
  log "Download Bitbucket: apri lo step Deploy -> Artifacts -> scarica out/$ARCHIVE_NAME"
  exit 0
fi

if [[ "$RELEASE_MODE" != "SSH" ]]; then
  die "RELEASE_MODE non supportato in deploy: $RELEASE_MODE"
fi

resolve_ssh_target_vars "$CLIENT" "$ENV"

APP_ROOT="$DEPLOY_PATH"
RELEASES_DIR="$APP_ROOT/releases"
SHARED_DIR="$APP_ROOT/shared"
NEW_RELEASE_DIR="$RELEASES_DIR/$RELEASE_ID"
REMOTE_TMP_ARCHIVE="/tmp/$ARCHIVE_NAME"

echo "Deploying release: $RELEASE_ID"
echo "App root: $APP_ROOT"
echo "New release dir: $NEW_RELEASE_DIR"

mkdir -p ~/.ssh
chmod 700 ~/.ssh

printf '%s' "$BITBUCKET_SSH_KEY_B64" | base64 -d | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa

cat > ~/.ssh/config <<EOF
Host deploy-target
  HostName $SERVER_HOST
  User $SSH_USER
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
  StrictHostKeyChecking yes
EOF

chmod 600 ~/.ssh/config
ssh-keyscan -H "$SERVER_HOST" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts

# 1) Prepara struttura remota
ssh deploy-target "
  set -euo pipefail
  sudo mkdir -p '$APP_ROOT'
  sudo mkdir -p '$RELEASES_DIR'
  sudo mkdir -p '$SHARED_DIR'
"

# 2) Upload archivio
scp "out/$ARCHIVE_NAME" deploy-target:"$REMOTE_TMP_ARCHIVE"

# 3) Estrai nuova release
ssh deploy-target "
  set -euo pipefail

  sudo rm -rf '$NEW_RELEASE_DIR'
  sudo mkdir -p '$NEW_RELEASE_DIR'
  sudo tar -xzf '$REMOTE_TMP_ARCHIVE' -C '$NEW_RELEASE_DIR'
  sudo rm -f '$REMOTE_TMP_ARCHIVE'
"

# 4) Shared directories (opzionale)
#
# Se hai directory persistenti (uploads, logs, cache, ecc.)
# decommenta e adatta questa sezione
#
# ssh deploy-target "
#   set -euo pipefail
#   sudo mkdir -p '$SHARED_DIR/uploads'
#   sudo mkdir -p '$SHARED_DIR/logs'
#
#   sudo rm -rf '$NEW_RELEASE_DIR/public/uploads'
#   sudo ln -sfn '$SHARED_DIR/uploads' '$NEW_RELEASE_DIR/public/uploads'
#
#   sudo rm -rf '$NEW_RELEASE_DIR/logs'
#   sudo ln -sfn '$SHARED_DIR/logs' '$NEW_RELEASE_DIR/logs'
# "

# 5) Permessi release
ssh deploy-target "
  set -euo pipefail
  sudo find '$NEW_RELEASE_DIR' -type d -exec chmod 2775 {} \;
  sudo find '$NEW_RELEASE_DIR' -type f -exec chmod 664 {} \;
  sudo chown -R nginx:nginx '$NEW_RELEASE_DIR'
"

# 6) Verifica tecnica PRIMA dello switch
ssh deploy-target "
  set -euo pipefail
  cd '$NEW_RELEASE_DIR'
  php -l index.php
  php -l com/conf/init.inc.php
"

# 7) Switch atomico del symlink latest
ssh deploy-target "
  set -euo pipefail

  PREV_TARGET=\$(readlink -f '$APP_ROOT/latest' || true)
  echo \"Previous live release: \${PREV_TARGET:-none}\"

  sudo ln -sfn '$NEW_RELEASE_DIR' '$APP_ROOT/latest_tmp'
  sudo mv -Tf '$APP_ROOT/latest_tmp' '$APP_ROOT/latest'

  echo 'Current live release:'
  readlink -f '$APP_ROOT/latest'
"

# 8) Pulizia: tieni solo ultima e penultima
ssh deploy-target "
  set -euo pipefail
  cd '$RELEASES_DIR'

  OLD_RELEASES=\$(ls -1dt */ | tail -n +3 || true)

  if [ -n \"\$OLD_RELEASES\" ]; then
    echo 'Old releases to remove:'
    echo \"\$OLD_RELEASES\"
    echo \"\$OLD_RELEASES\" | xargs -r -I{} sudo rm -rf '$RELEASES_DIR'/{}
  else
    echo 'No old releases to remove'
  fi

  echo 'Remaining releases:'
  ls -1dt */
"

# 9) Ownership finale di tutta la root applicativa
ssh deploy-target "
  set -euo pipefail
  sudo chown -R nginx:nginx '$APP_ROOT'
"

echo "Deploy completed successfully"
log "Artifact disponibile anche nello step Deploy: out/$ARCHIVE_NAME"
log "Download Bitbucket: apri lo step Deploy -> Artifacts -> scarica out/$ARCHIVE_NAME"
