#!/usr/bin/env bash
# Lanceur local → SSH OVH pour sauvegarde / restauration Sherlook.
#
# Prérequis : alias SSH ovh_ssh (ou DEPLOY_SSH=…)
#
# Usage (depuis la racine du dépôt) :
#   ./scripts/backup-ovh.sh --install          # copie les scripts sur le serveur
#   ./scripts/backup-ovh.sh                    # lance une sauvegarde complète
#   ./scripts/backup-ovh.sh --db-only
#   ./scripts/backup-ovh.sh --uploads-only
#   ./scripts/backup-ovh.sh --list
#   ./scripts/backup-ovh.sh --restore 20260719_043000 --db
#   ./scripts/backup-ovh.sh --restore 20260719_043000 --uploads
#   ./scripts/backup-ovh.sh --restore 20260719_043000 --all
#
# Variables :
#   DEPLOY_SSH=ovh_ssh
#   API_DIR=api-26          (chemin relatif au home distant, ou absolu)
#   BACKUP_ROOT=backups
#   KEEP_DAYS=14

set -euo pipefail

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
LOCAL_BACKUP_DIR="$ROOT/scripts/ovh-backup"
DEPLOY_SSH="${DEPLOY_SSH:-ovh_ssh}"
REMOTE_BIN="${REMOTE_BIN:-bin/sherlook-backup}"
API_DIR_REMOTE="${API_DIR:-api-26}"
BACKUP_ROOT_REMOTE="${BACKUP_ROOT:-backups}"
KEEP_DAYS="${KEEP_DAYS:-14}"

if [[ ! -d "$LOCAL_BACKUP_DIR" ]]; then
  echo "Dossier scripts introuvable : $LOCAL_BACKUP_DIR" >&2
  exit 1
fi

remote_env() {
  # Force chemins relatifs au $HOME distant
  echo "export API_DIR=\"\$HOME/${API_DIR_REMOTE#~/}\""
  echo "export BACKUP_ROOT=\"\$HOME/${BACKUP_ROOT_REMOTE#~/}\""
  echo "export KEEP_DAYS=\"$KEEP_DAYS\""
  if [[ "${INCLUDE_THUMBS:-0}" == "1" ]]; then
    echo "export INCLUDE_THUMBS=1"
  fi
}

cmd_install() {
  echo ">>> Installation des scripts sur ${DEPLOY_SSH}:~/${REMOTE_BIN}"
  ssh "$DEPLOY_SSH" "mkdir -p \"\$HOME/${REMOTE_BIN}\""
  rsync -avz --delete \
    "$LOCAL_BACKUP_DIR/" \
    "${DEPLOY_SSH}:${REMOTE_BIN}/"
  ssh "$DEPLOY_SSH" "chmod +x \"\$HOME/${REMOTE_BIN}\"/*.sh"
  echo ">>> OK. Sur le serveur :"
  echo "    ~/${REMOTE_BIN}/backup.sh"
}

cmd_backup() {
  local extra=("$@")
  echo ">>> Sauvegarde distante via ${DEPLOY_SSH}…"
  # shellcheck disable=SC2029
  ssh "$DEPLOY_SSH" "$(remote_env)
\"\$HOME/${REMOTE_BIN}/backup.sh\" $(printf '%q ' "${extra[@]}")"
}

cmd_list() {
  # shellcheck disable=SC2029
  ssh "$DEPLOY_SSH" "$(remote_env)
\"\$HOME/${REMOTE_BIN}/list.sh\""
}

cmd_restore() {
  local stamp="$1"
  local mode="${2:---all}"
  echo ">>> Restauration distante $stamp $mode"
  echo "    CONFIRM=RESTORE sera envoyé au serveur."
  read -r -p "Confirmer la restauration sur PROD ? (oui/non) : " answer
  if [[ "$answer" != "oui" ]]; then
    echo "Annulé."
    exit 1
  fi
  # shellcheck disable=SC2029
  ssh "$DEPLOY_SSH" "$(remote_env)
export CONFIRM=RESTORE
\"\$HOME/${REMOTE_BIN}/restore.sh\" $(printf '%q ' "$stamp" "$mode")"
}

ACTION="${1:-}"
case "$ACTION" in
  --install)
    cmd_install
    ;;
  --list)
    cmd_list
    ;;
  --db-only)
    cmd_backup --db-only
    ;;
  --uploads-only)
    cmd_backup --uploads-only
    ;;
  --restore)
    shift
    STAMP="${1:-}"
    shift || true
    if [[ -z "$STAMP" ]]; then
      echo "Usage : $0 --restore <stamp> [--db|--uploads|--all]" >&2
      exit 1
    fi
    MODE="${1:---all}"
    cmd_restore "$STAMP" "$MODE"
    ;;
  -h|--help)
    sed -n '2,22p' "$0"
    exit 0
    ;;
  ""|backup)
    cmd_backup
    ;;
  *)
    echo "Option inconnue : $ACTION (voir --help)" >&2
    exit 1
    ;;
esac
