#!/usr/bin/env bash
# Restore a backup made by backup.sh.
#   restore.sh <backup.tgz.enc> [target_db]        default target: cioclub_restore_test (safe drill)
#   restore.sh <backup.tgz.enc> cioclub --live     overwrites the live database and files (asks for confirmation)
set -euo pipefail
# shellcheck source=/dev/null
[ -f /etc/cioclub/backup.env ] && . /etc/cioclub/backup.env
FILE="${1:?usage: restore.sh <backup.tgz.enc> [target_db] [--live]}"
TARGET="${2:-cioclub_restore_test}"
LIVE="${3:-}"
APP_DIR="${APP_DIR:-/var/www/cioclub}"
MYSQL_CNF="${MYSQL_CNF:-/etc/cioclub/backup.cnf}"
KEY_FILE="${KEY_FILE:-/etc/cioclub/backup.key}"
[[ "$TARGET" =~ ^[A-Za-z0-9_]+$ ]] || { echo "Invalid database name" >&2; exit 1; }
if [ -f "$FILE.sha256" ]; then sha256sum -c "$FILE.sha256" >/dev/null || { echo "Checksum mismatch: $FILE" >&2; exit 1; }; fi
if [ "$LIVE" = "--live" ] && [ "${ASSUME_YES:-}" != "1" ]; then
  read -r -p "This overwrites database '$TARGET' and the live uploads. Type RESTORE to continue: " ans
  [ "$ans" = "RESTORE" ] || { echo "Aborted"; exit 1; }
fi
umask 077
WORK="$(mktemp -d)"; trap 'rm -rf "$WORK"' EXIT
openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 -pass "file:$KEY_FILE" -in "$FILE" -out "$WORK/bundle.tgz"
tar -C "$WORK" -xzf "$WORK/bundle.tgz"
( cd "$WORK" && sha256sum -c SHA256SUMS >/dev/null ) || { echo "Bundle integrity check failed" >&2; exit 1; }
mysql --defaults-extra-file="$MYSQL_CNF" -e "CREATE DATABASE IF NOT EXISTS \`$TARGET\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
mysql --defaults-extra-file="$MYSQL_CNF" "$TARGET" < "$WORK/db.sql"
if [ "$LIVE" = "--live" ]; then
  tar -C "$APP_DIR/shared" -xf "$WORK/files.tar"
  echo "Files restored into $APP_DIR/shared. Rebuild the AI search index: Admin > AI > Rebuild now."
else
  mkdir -p "$WORK/files" && tar -C "$WORK/files" -xf "$WORK/files.tar"
  echo "Files verified ($(find "$WORK/files" -type f | wc -l) files); not copied (drill mode)."
fi
echo "Restored into database '$TARGET': $(mysql --defaults-extra-file="$MYSQL_CNF" -N -e "SELECT COUNT(*) FROM \`$TARGET\`.users") users, $(mysql --defaults-extra-file="$MYSQL_CNF" -N -e "SELECT COUNT(*) FROM \`$TARGET\`.posts") posts."
