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

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

log() { printf '[limristem-mail-restore] %s\n' "$*"; }

usage() {
  cat <<'EOF'
Uso:
  restore.sh --source /var/backups/limristem-mail/<backup-dir> [--target-root /] [--restore-files] [--restore-db]

Note:
  - Il restore filesystem di backup incrementali richiede l'applicazione della catena completa (full + incrementali successivi).
  - I backup MariaDB fisici vengono solo estratti/stage-ati: la copy-back finale richiede un intervento controllato.
EOF
}

require_root() {
  if [[ $EUID -ne 0 ]]; then
    log "Questo script va eseguito come root."
    exit 1
  fi
}

load_env() {
  limristem_mail_load_env_file "$LIMRISTEM_MAIL_CONFIG_DIR/limristem-mail.env"
}

mysql_client_cmd() {
  if command -v mariadb >/dev/null 2>&1; then
    printf 'mariadb\n'
  else
    printf 'mysql\n'
  fi
}

SOURCE_DIR=''
TARGET_ROOT='/'
RESTORE_FILES=false
RESTORE_DB=false

while [[ $# -gt 0 ]]; do
  case "$1" in
    --source)
      SOURCE_DIR=$2
      shift 2
      ;;
    --target-root)
      TARGET_ROOT=$2
      shift 2
      ;;
    --restore-files)
      RESTORE_FILES=true
      shift
      ;;
    --restore-db)
      RESTORE_DB=true
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      log "Argomento non riconosciuto: $1"
      usage
      exit 1
      ;;
  esac
done

main() {
  require_root
  load_env

  if [[ -z "$SOURCE_DIR" || ! -d "$SOURCE_DIR" ]]; then
    log "Specifica una directory backup valida con --source."
    exit 1
  fi

  if [[ "$RESTORE_FILES" != true && "$RESTORE_DB" != true ]]; then
    log "Seleziona almeno una tra --restore-files e --restore-db."
    exit 1
  fi

  if [[ "$RESTORE_FILES" == true ]]; then
    local fs_archive
    fs_archive=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name 'filesystem.*.tar*' | sort | head -n 1)
    if [[ -z "$fs_archive" ]]; then
      log "Archivio filesystem non trovato in $SOURCE_DIR"
      exit 1
    fi
    mkdir -p "$TARGET_ROOT"
    log "Ripristino filesystem da ${fs_archive} verso ${TARGET_ROOT}"
    tar --extract --auto-compress --listed-incremental=/dev/null --file="$fs_archive" --directory="$TARGET_ROOT"
  fi

  if [[ "$RESTORE_DB" == true ]]; then
    local logical_dump physical_dir mysql_cmd
    logical_dump=$(find "$SOURCE_DIR" -maxdepth 1 -type f -name 'mariadb.logical.sql*' | sort | head -n 1)
    physical_dir=$(find "$SOURCE_DIR" -maxdepth 1 -type d -name 'mariadb.physical' | sort | head -n 1)
    mysql_cmd=$(mysql_client_cmd)

    if [[ -n "$logical_dump" ]]; then
      log "Ripristino dump logico ${logical_dump}"
      if [[ "$logical_dump" == *.gz ]]; then
        gunzip -c "$logical_dump" | MYSQL_PWD="${LIMRISTEM_MAIL_DB_PASS}" "$mysql_cmd" -h "${LIMRISTEM_MAIL_DB_HOST}" -P "${LIMRISTEM_MAIL_DB_PORT}" -u"${LIMRISTEM_MAIL_DB_USER}" "${LIMRISTEM_MAIL_DB_NAME}"
      else
        MYSQL_PWD="${LIMRISTEM_MAIL_DB_PASS}" "$mysql_cmd" -h "${LIMRISTEM_MAIL_DB_HOST}" -P "${LIMRISTEM_MAIL_DB_PORT}" -u"${LIMRISTEM_MAIL_DB_USER}" "${LIMRISTEM_MAIL_DB_NAME}" < "$logical_dump"
      fi
    elif [[ -n "$physical_dir" ]]; then
      log "Backup MariaDB fisico rilevato in ${physical_dir}"
      log "Esegui manualmente 'mariabackup --prepare --target-dir=${physical_dir}' e la successiva copy-back in una finestra controllata."
    else
      log "Nessun backup database trovato in $SOURCE_DIR"
      exit 1
    fi
  fi

  log "Restore completato."
}

main "$@"
