#!/usr/bin/env bash
# Faunamix MySQL yedeğini geri yükler. Yıkıcı işlemdir; onay anahtarı olmadan çalışmaz.
# Kullanım:
#   FAUNAMIX_RESTORE_CONFIRM=RESTORE_faunamix ./scripts/restore-database.sh path/to/backup.sql.gz
# İsteğe bağlı: --skip-pre-backup ile geri yükleme öncesi snapshot almayı atla.
set -euo pipefail

usage() {
  cat <<'EOF'
Kullanim:
  FAUNAMIX_RESTORE_CONFIRM=RESTORE_<DB_NAME> ./scripts/restore-database.sh [--skip-pre-backup] <backup.sql|backup.sql.gz>
EOF
}

SKIP_PRE_BACKUP=0
BACKUP_FILE=""
for arg in "$@"; do
  case "$arg" in
    --skip-pre-backup)
      SKIP_PRE_BACKUP=1
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      if [[ -n "$BACKUP_FILE" ]]; then
        echo "Beklenmeyen arguman: $arg" >&2
        usage >&2
        exit 1
      fi
      BACKUP_FILE="$arg"
      ;;
  esac
done

if [[ -z "$BACKUP_FILE" ]]; then
  usage >&2
  exit 1
fi

if [[ ! -f "$BACKUP_FILE" ]]; then
  echo "Backup dosyasi bulunamadi: $BACKUP_FILE" >&2
  exit 1
fi

_SCRIPT_SOURCE="${BASH_SOURCE[0]:-$0}"
if [[ "$_SCRIPT_SOURCE" != /* ]]; then
  _SCRIPT_SOURCE="$PWD/${_SCRIPT_SOURCE#./}"
fi
ROOT="$(cd "$(dirname "$_SCRIPT_SOURCE")/.." && pwd)"
ENV_FILE="${FAUNAMIX_ENV_FILE:-$ROOT/api/.env}"

load_env() {
  if [[ -f "$ENV_FILE" ]]; then
    set -a
    # shellcheck disable=SC1090
    source "$ENV_FILE"
    set +a
  fi
}

apply_aliases() {
  DB_HOST="${DB_HOST:-${MYSQL_HOST:-127.0.0.1}}"
  DB_PORT="${DB_PORT:-${MYSQL_PORT:-3306}}"
  DB_NAME="${DB_NAME:-${MYSQL_DATABASE:-faunamix}}"
  DB_USER="${DB_USER:-${MYSQL_USER:-root}}"
  if [[ -z "${DB_PASS:-}" ]]; then
    DB_PASS="${MYSQL_PASSWORD:-${MYSQL_ROOT_PASSWORD:-}}"
  fi
}

pick_mysql_bin() {
  if command -v mysql >/dev/null 2>&1; then
    echo "mysql"
    return
  fi
  if command -v mariadb >/dev/null 2>&1; then
    echo "mariadb"
    return
  fi
  echo "Eksik: mysql veya mariadb istemcisi bulunamadi." >&2
  exit 1
}

load_env
apply_aliases

: "${DB_HOST:?DB_HOST veya MYSQL_HOST gerekli}"
: "${DB_PORT:?DB_PORT veya MYSQL_PORT gerekli}"
: "${DB_NAME:?DB_NAME veya MYSQL_DATABASE gerekli}"
: "${DB_USER:?DB_USER veya MYSQL_USER gerekli}"

EXPECTED_CONFIRM="RESTORE_${DB_NAME}"
if [[ "${FAUNAMIX_RESTORE_CONFIRM:-}" != "$EXPECTED_CONFIRM" ]]; then
  echo "Geri yukleme yikici islem. Devam etmek icin su sekilde calistirin:" >&2
  echo "  FAUNAMIX_RESTORE_CONFIRM=$EXPECTED_CONFIRM ./scripts/restore-database.sh \"$BACKUP_FILE\"" >&2
  exit 1
fi

if [[ "$SKIP_PRE_BACKUP" != "1" ]]; then
  "$ROOT/scripts/backup-database.sh" >/dev/null
fi

MYSQL_BIN="$(pick_mysql_bin)"
MYSQL_ARGS=( --host="$DB_HOST" --port="$DB_PORT" --protocol=TCP --user="$DB_USER" --default-character-set=utf8mb4 )
if [[ "$DB_HOST" == *".railway.internal"* ]] && [[ "${FAUNAMIX_MYSQL_SSL:-}" != "1" ]]; then
  MYSQL_ARGS+=( --skip-ssl )
elif [[ "$DB_HOST" == *".rlwy.net"* ]] || [[ "${FAUNAMIX_MYSQL_SSL:-}" == "1" ]]; then
  MYSQL_ARGS+=( --ssl )
fi

run_mysql_restore() {
  if [[ -n "${DB_PASS:-}" ]]; then
    MYSQL_PWD="$DB_PASS" "$MYSQL_BIN" "${MYSQL_ARGS[@]}" "$@"
  else
    "$MYSQL_BIN" "${MYSQL_ARGS[@]}" "$@"
  fi
}

case "$BACKUP_FILE" in
  *.sql.gz)
    gzip -dc "$BACKUP_FILE" | run_mysql_restore "$DB_NAME"
    ;;
  *.sql)
    run_mysql_restore "$DB_NAME" < "$BACKUP_FILE"
    ;;
  *)
    echo "Desteklenmeyen backup uzantisi: $BACKUP_FILE (beklenen: .sql veya .sql.gz)" >&2
    exit 1
    ;;
esac

echo "Restore tamamlandi: $BACKUP_FILE -> $DB_NAME"
