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

bundle_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
state_dir=/var/lib/apache2-offline-upgrade
backup_dir=${1:-}
rollback_version=2.4.41-4ubuntu3.23
repo_dir="$bundle_dir/repo"
repo_list=/etc/apt/sources.list.d/apache2-offline-upgrade.list
export DEBIAN_FRONTEND=noninteractive

service_stop() {
  [ "${APACHE_OFFLINE_SKIP_SYSTEMD:-0}" = 1 ] || systemctl stop apache2 2>/dev/null || true
}
service_start_and_check() {
  if [ "${APACHE_OFFLINE_SKIP_SYSTEMD:-0}" != 1 ]; then
    systemctl start apache2
    systemctl is-active --quiet apache2
  fi
}
apt_local() {
  apt-get \
    -o Dir::Etc::sourcelist="$repo_list" \
    -o Dir::Etc::sourceparts="-" \
    -o APT::Get::List-Cleanup=0 \
    "$@"
}
prepare_repo() {
  printf 'deb [trusted=yes] file:%s ./\n' "$repo_dir" > "$repo_list"
  apt_local update
}
cleanup_repo() {
  rm -f "$repo_list"
}

if [ "$(id -u)" -ne 0 ]; then
  echo "ERROR: run with sudo: sudo ./rollback.sh" >&2
  exit 1
fi
if [ -z "$backup_dir" ] && [ -s "$state_dir/last-backup" ]; then
  backup_dir=$(cat "$state_dir/last-backup")
fi
if [ -z "$backup_dir" ] || [ ! -f "$backup_dir/etc-apache2.tar.gz" ]; then
  echo "ERROR: upgrade configuration backup was not found" >&2
  exit 1
fi

service_stop
trap cleanup_repo EXIT
prepare_repo
apt_local \
  -o Dpkg::Options::=--force-confold \
  --allow-downgrades -y install \
  "apache2-bin=$rollback_version" \
  "apache2-data=$rollback_version" \
  "apache2-utils=$rollback_version" \
  "apache2=$rollback_version"
cleanup_repo
trap - EXIT

failed_config="/etc/apache2.failed-$(date +%Y%m%d-%H%M%S)"
if [ -d /etc/apache2 ]; then
  mv /etc/apache2 "$failed_config"
fi
tar -C / -xzpf "$backup_dir/etc-apache2.tar.gz"

apache2ctl configtest
service_start_and_check

echo "OK: Focal Apache packages and configuration restored"
echo "Failed configuration retained at: $failed_config"
