#!/usr/bin/env bash
# Create a versioned backup on the remote Windows server before deploy.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=common.sh
source "${SCRIPT_DIR}/common.sh"

run_remote_backup() {
  if [[ "${BACKUP_ENABLED}" != "true" ]]; then
    log "Skipping remote backup (BACKUP_ENABLED=false)"
    return 0
  fi

  local stamp git_commit backup_name remote_backup_root
  stamp="$(date +%Y%m%d-%H%M%S)"
  git_commit="$(git -C "${PROJECT_ROOT}" rev-parse --short HEAD 2>/dev/null || echo 'nogit')"
  backup_name="backup-${stamp}-${git_commit}"
  remote_backup_root="${DEPLOY_PATH}/${BACKUP_DIR}"

  log "Creating remote backup: ${backup_name}"

  if [[ "${DEPLOY_PLATFORM:-windows}" == "linux" ]]; then
    ssh_cmd "
      mkdir -p '${remote_backup_root}/${backup_name}' &&
      rsync -a --delete --exclude='${BACKUP_DIR}/' '${DEPLOY_PATH}/' '${remote_backup_root}/${backup_name}/' &&
      ls -1dt '${remote_backup_root}'/backup-* 2>/dev/null | tail -n +$((BACKUP_KEEP + 1)) | xargs -r rm -rf &&
      echo 'Backup created: ${remote_backup_root}/${backup_name}'
    "
    log "Remote backup complete: ${remote_backup_root}/${backup_name}"
    return 0
  fi

  local win_src="${DEPLOY_PATH_WIN}"
  local win_backup_root="${DEPLOY_PATH_WIN}/${BACKUP_DIR}"

  ssh_cmd "powershell -NoProfile -Command \"
    \\\$src = '${win_src}';
    \\\$dest = '${win_backup_root}/${backup_name}';
    \\\$root = '${win_backup_root}';
    if (-not (Test-Path \\\$src)) { Write-Error 'Deploy path not found: ' + \\\$src; exit 1 }
    New-Item -ItemType Directory -Force -Path \\\$root | Out-Null;
    Copy-Item -Path \\\$src -Destination \\\$dest -Recurse -Force;
    \\\$keep = ${BACKUP_KEEP};
    Get-ChildItem \\\$root -Directory | Where-Object { \\\$_.Name -like 'backup-*' } |
      Sort-Object LastWriteTime -Descending |
      Select-Object -Skip \\\$keep |
      ForEach-Object { Remove-Item \\\$_.FullName -Recurse -Force };
    Write-Output ('Backup created: ' + \\\$dest)
  \"" || ssh_cmd "
    mkdir -p '${remote_backup_root}' && \
    cp -a '${DEPLOY_PATH}/.' '${remote_backup_root}/${backup_name}/' && \
    ls -1dt '${remote_backup_root}'/backup-* 2>/dev/null | tail -n +$((BACKUP_KEEP + 1)) | xargs -r rm -rf
  "

  log "Remote backup complete: ${remote_backup_root}/${backup_name}"
}

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  load_config
  run_remote_backup
fi
