#!/usr/bin/env bash

# uninstall-loganalyzer-agent.sh
# Удаление LogAnalyzer-агента, установленного install-loganalyzer-agent.sh.
# Удаляет unit, бинарник, конфигурацию, состояние и системного пользователя/группу.
# Файлы логов, каталоги приложений и системные пакеты не удаляются.

set -Eeuo pipefail
IFS=$'\n\t'

INSTALL_DIR="/usr/local/bin"
VECTOR_BIN="${INSTALL_DIR}/loganalyzer"
CONFIG_DIR="/etc/loganalyzer"
DATA_DIR="/var/lib/loganalyzer"
SERVICE_NAME="loganalyzer-agent"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
SYSTEM_USER="loganalyzer"
SYSTEM_GROUP="loganalyzer"

REMOVE_CONFIG=true
REMOVE_DATA=true
REMOVE_USER=true
REMOVE_GROUP=true
PURGE=false
DRY_RUN=false
YES=false

if [ "${EUID}" -ne 0 ]; then
  exec sudo --preserve-env=REMOVE_CONFIG,REMOVE_DATA,REMOVE_USER,REMOVE_GROUP,PURGE,DRY_RUN,YES "$0" "$@"
fi

usage() {
  cat <<'EOF'
Использование: uninstall-loganalyzer-agent.sh [опции]

Удаляет LogAnalyzer-агент и связанные с ним ресурсы.

Опции:
  -y, --yes             Не спрашивать подтверждение
  --dry-run             Только показать, что будет удалено
  --keep-config         Не удалять /etc/loganalyzer
  --keep-data           Не удалять /var/lib/loganalyzer
  --keep-user           Не удалять пользователя loganalyzer
  --keep-group          Не удалять группу loganalyzer
  --purge               Удалить всё
  -h, --help            Показать эту справку
EOF
}

while [ "$#" -gt 0 ]; do
  case "$1" in
    -y|--yes) YES=true ;;
    --dry-run) DRY_RUN=true ;;
    --keep-config) REMOVE_CONFIG=false ;;
    --keep-data) REMOVE_DATA=false ;;
    --keep-user) REMOVE_USER=false ;;
    --keep-group) REMOVE_GROUP=false ;;
    --purge)
      PURGE=true
      REMOVE_CONFIG=true
      REMOVE_DATA=true
      REMOVE_USER=true
      REMOVE_GROUP=true
      ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Неизвестная опция: $1" >&2; usage >&2; exit 2 ;;
  esac
  shift
done

if [ "$PURGE" = true ]; then
  echo "Режим PURGE: будут удалены сервис, бинарник, конфигурация, данные," >&2
  echo "пользователь vector и группа vector. Файлы логов не удаляются." >&2
fi

TARGETS=("${SERVICE_FILE}" "${VECTOR_BIN}")
[ "$REMOVE_CONFIG" = true ] && TARGETS+=("${CONFIG_DIR}")
[ "$REMOVE_DATA" = true ] && TARGETS+=("${DATA_DIR}")
[ "$REMOVE_USER" = true ] && TARGETS+=("пользователь ${SYSTEM_USER}")
[ "$REMOVE_GROUP" = true ] && TARGETS+=("группа ${SYSTEM_GROUP}")

echo "Будут обработаны:"
for target in "${TARGETS[@]}"; do
  echo "  - ${target}"
done

if [ "$DRY_RUN" = true ]; then
  echo "Режим dry-run: изменения не внесены."
  exit 0
fi

if [ "$YES" != true ]; then
  read -r -p "Продолжить удаление? [y/N]: " answer
  [[ "$answer" =~ ^[YyДд]$ ]] || { echo "Отменено."; exit 0; }
fi

log() { printf '[+] %s\n' "$*"; }
warn() { printf '[!] %s\n' "$*" >&2; }

if command -v systemctl >/dev/null 2>&1; then
  if systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null; then
    systemctl stop "$SERVICE_NAME"
    log "Сервис остановлен: ${SERVICE_NAME}"
  fi
  if systemctl is-enabled --quiet "$SERVICE_NAME" 2>/dev/null; then
    systemctl disable "$SERVICE_NAME" >/dev/null 2>&1 || true
    log "Автозапуск отключён: ${SERVICE_NAME}"
  fi
fi

if [ -e "$SERVICE_FILE" ] || [ -L "$SERVICE_FILE" ]; then
  rm -f "$SERVICE_FILE"
  log "Unit удалён: ${SERVICE_FILE}"
fi

if command -v systemctl >/dev/null 2>&1; then
  systemctl daemon-reload
  systemctl reset-failed "$SERVICE_NAME" >/dev/null 2>&1 || true
fi

if [ -e "$VECTOR_BIN" ] || [ -L "$VECTOR_BIN" ]; then
  rm -f "$VECTOR_BIN"
  log "Бинарник удалён: ${VECTOR_BIN}"
fi

if [ "$REMOVE_CONFIG" = true ] && { [ -e "$CONFIG_DIR" ] || [ -L "$CONFIG_DIR" ]; }; then
  rm -rf --one-file-system "$CONFIG_DIR"
  log "Конфигурация удалена: ${CONFIG_DIR}"
fi

if [ "$REMOVE_DATA" = true ] && { [ -e "$DATA_DIR" ] || [ -L "$DATA_DIR" ]; }; then
  rm -rf --one-file-system "$DATA_DIR"
  log "Данные и checkpoints удалены: ${DATA_DIR}"
fi

if [ "$REMOVE_USER" = true ] && id "$SYSTEM_USER" >/dev/null 2>&1; then
  if command -v userdel >/dev/null 2>&1; then
    userdel "$SYSTEM_USER"
    log "Пользователь удалён: ${SYSTEM_USER}"
  else
    warn "userdel не найден; пользователь ${SYSTEM_USER} не удалён."
  fi
fi

if [ "$REMOVE_GROUP" = true ] && getent group "$SYSTEM_GROUP" >/dev/null 2>&1; then
  if command -v groupdel >/dev/null 2>&1; then
    if groupdel "$SYSTEM_GROUP" 2>/dev/null; then
      log "Группа удалена: ${SYSTEM_GROUP}"
    else
      warn "Группа ${SYSTEM_GROUP} не удалена: возможно, она используется другими пользователями."
    fi
  else
    warn "groupdel не найден; группа ${SYSTEM_GROUP} не удалена."
  fi
fi

# Удаляем каталог CONFIG_DIR только если он стал пустым при сохранении
# конфигурации не требуется; при --keep-config он оставляется намеренно.

log "Удаление LogAnalyzer-агента завершено."
echo "Файлы логов и каталоги приложений не изменялись."
