#!/usr/bin/env bash
# WebPanel kaldırıcısı. Varsayılan davranış kullanıcı verisini ve container volume'lerini korur.
set -Eeuo pipefail

umask 077

ENV_INSTALL_DIR="${WEBPANEL_INSTALL_DIR:-}"
ENV_SERVICE_NAME="${WEBPANEL_SERVICE_NAME:-}"
ENV_BIN="${WEBPANEL_BIN:-}"
ENV_UPDATER_PATH="${WEBPANEL_UPDATER_PATH:-}"
ENV_UNINSTALLER_PATH="${WEBPANEL_UNINSTALLER_PATH:-}"
ENV_SERVICE_FILE="${WEBPANEL_SERVICE_FILE:-}"
ENV_UPDATE_SERVICE_FILE="${WEBPANEL_UPDATE_SERVICE_FILE:-}"
ENV_UPDATE_TIMER_FILE="${WEBPANEL_UPDATE_TIMER_FILE:-}"
CONFIG_DIR="${WEBPANEL_CONFIG_DIR:-/etc/webpanel}"
RELEASE_CONFIG="$CONFIG_DIR/release.conf"
INSTALL_DIR="${ENV_INSTALL_DIR:-/opt/webpanel}"
DATA_DIR="${WEBPANEL_DATA_DIR:-/var/lib/webpanel}"
SERVICE_NAME="${ENV_SERVICE_NAME:-webpanel}"
BIN="${ENV_BIN:-$INSTALL_DIR/webpanel}"
UPDATER_PATH="${ENV_UPDATER_PATH:-/usr/local/sbin/webpanel-update}"
UNINSTALLER_PATH="${ENV_UNINSTALLER_PATH:-/usr/local/sbin/webpanel-uninstall}"
SERVICE_FILE="${ENV_SERVICE_FILE:-/etc/systemd/system/$SERVICE_NAME.service}"
UPDATE_SERVICE_FILE="${ENV_UPDATE_SERVICE_FILE:-/etc/systemd/system/$SERVICE_NAME-update.service}"
UPDATE_TIMER_FILE="${ENV_UPDATE_TIMER_FILE:-/etc/systemd/system/$SERVICE_NAME-update.timer}"
PURGE=0
ASSUME_YES=0

die() { printf 'HATA: %s\n' "$*" >&2; exit 1; }
log() { printf '==> %s\n' "$*"; }

load_config() {
    local key value
    if [ -r "$RELEASE_CONFIG" ]; then
        while IFS='=' read -r key value; do
            case "$key" in
                WEBPANEL_INSTALL_DIR) [ -n "$ENV_INSTALL_DIR" ] || INSTALL_DIR="$value" ;;
                WEBPANEL_SERVICE_NAME) [ -n "$ENV_SERVICE_NAME" ] || SERVICE_NAME="$value" ;;
                WEBPANEL_BIN) [ -n "$ENV_BIN" ] || BIN="$value" ;;
                WEBPANEL_UPDATER_PATH) [ -n "$ENV_UPDATER_PATH" ] || UPDATER_PATH="$value" ;;
                WEBPANEL_UNINSTALLER_PATH) [ -n "$ENV_UNINSTALLER_PATH" ] || UNINSTALLER_PATH="$value" ;;
            esac
        done < "$RELEASE_CONFIG"
    fi
    if [ -r "$CONFIG_DIR/webpanel.env" ]; then
        value="$(awk -F= '$1 == "WEBPANEL_DATA_DIR" { print $2; exit }' "$CONFIG_DIR/webpanel.env")"
        DATA_DIR="${value:-$DATA_DIR}"
    fi
    SERVICE_FILE="${ENV_SERVICE_FILE:-/etc/systemd/system/$SERVICE_NAME.service}"
    UPDATE_SERVICE_FILE="${ENV_UPDATE_SERVICE_FILE:-/etc/systemd/system/$SERVICE_NAME-update.service}"
    UPDATE_TIMER_FILE="${ENV_UPDATE_TIMER_FILE:-/etc/systemd/system/$SERVICE_NAME-update.timer}"
}

validate_safe_path() {
    local label="$1" value="$2" canonical
    case "$value" in /*) ;; *) die "$label mutlak bir yol olmalı: $value" ;; esac
    case "$value" in / | /opt | /usr | /usr/local | /var | /var/lib | /etc | /root | /home)
        die "$label silmek için fazla geniş: $value" ;;
    esac
    [[ "$value" != *$'\n'* && "$value" != *$'\r'* && "$value" != *' '* ]] ||
        die "$label boşluk veya satır sonu içeremez"
    canonical="$(realpath -m -- "$value")"
    [ "$canonical" = "$value" ] || die "$label kanonik olmalı: $value"
}

usage() {
    cat <<'EOF'
Kullanım:
  webpanel-uninstall              Programı kaldır, panel verisini koru
  webpanel-uninstall --purge      Programı ve panel veri/yapılandırmasını sil
  webpanel-uninstall --purge --yes  Etkileşimsiz kalıcı silme

Docker container'ları, image'ları ve named volume'leri bu komut tarafından silinmez.
EOF
}

while [ "$#" -gt 0 ]; do
    case "$1" in
        --purge) PURGE=1 ;;
        --yes) ASSUME_YES=1 ;;
        -h | --help | help) usage; exit 0 ;;
        *) usage >&2; die "Bilinmeyen seçenek: $1" ;;
    esac
    shift
done

[ "$(id -u)" -eq 0 ] || die "Bu komut root olarak çalıştırılmalı (sudo)."
command -v realpath >/dev/null 2>&1 || die "Gerekli komut bulunamadı: realpath"
load_config
validate_safe_path "Kurulum dizini" "$INSTALL_DIR"
validate_safe_path "Veri dizini" "$DATA_DIR"
validate_safe_path "Yapılandırma dizini" "$CONFIG_DIR"
validate_safe_path "Binary yolu" "$BIN"
validate_safe_path "Güncelleyici yolu" "$UPDATER_PATH"
validate_safe_path "Kaldırıcı yolu" "$UNINSTALLER_PATH"
validate_safe_path "Servis dosyası" "$SERVICE_FILE"
validate_safe_path "Güncelleme servisi" "$UPDATE_SERVICE_FILE"
validate_safe_path "Güncelleme timer dosyası" "$UPDATE_TIMER_FILE"
[[ "$SERVICE_NAME" =~ ^[a-zA-Z0-9][a-zA-Z0-9_.@-]*$ ]] || die "Geçersiz servis adı"
[ "$BIN" = "$INSTALL_DIR/webpanel" ] || die "Binary kurulum dizini altında webpanel olmalı"
[ "$UPDATER_PATH" = "/usr/local/sbin/$SERVICE_NAME-update" ] || die "Güncelleyici yolu servis adıyla eşleşmiyor"
[ "$UNINSTALLER_PATH" = "/usr/local/sbin/$SERVICE_NAME-uninstall" ] || die "Kaldırıcı yolu servis adıyla eşleşmiyor"
[ "$SERVICE_FILE" = "/etc/systemd/system/$SERVICE_NAME.service" ] || die "Servis dosyası servis adıyla eşleşmiyor"
[ "$UPDATE_SERVICE_FILE" = "/etc/systemd/system/$SERVICE_NAME-update.service" ] || die "Güncelleme servisi yolu geçersiz"
[ "$UPDATE_TIMER_FILE" = "/etc/systemd/system/$SERVICE_NAME-update.timer" ] || die "Güncelleme timer yolu geçersiz"

if [ "$PURGE" -eq 1 ] && [ "$ASSUME_YES" -ne 1 ]; then
    [ -t 0 ] || die "Etkileşimsiz kalıcı silme için --purge --yes birlikte kullanılmalı"
    printf '%s ve %s kalıcı olarak silinecek. Devam etmek için SİL yazın: ' "$DATA_DIR" "$CONFIG_DIR"
    read -r confirmation
    [ "$confirmation" = "SİL" ] || die "Kaldırma iptal edildi"
fi

log "WebPanel servisi durduruluyor"
systemctl disable --now "$SERVICE_NAME-update.timer" >/dev/null 2>&1 || true
systemctl disable --now "$SERVICE_NAME" >/dev/null 2>&1 || true
rm -f -- "$SERVICE_FILE" "$UPDATE_SERVICE_FILE" "$UPDATE_TIMER_FILE"
systemctl daemon-reload

rm -f -- "$BIN" "$UPDATER_PATH" "$UNINSTALLER_PATH" "$INSTALL_DIR/VERSION"
if [ -d "$INSTALL_DIR/releases" ]; then
    rm -rf -- "$INSTALL_DIR/releases"
fi
rmdir "$INSTALL_DIR" >/dev/null 2>&1 || true

if [ "$PURGE" -eq 1 ]; then
    log "Panel verisi ve yapılandırması siliniyor"
    rm -rf -- "$DATA_DIR" "$CONFIG_DIR"
else
    log "Panel verisi korundu: $DATA_DIR"
    log "Yapılandırma korundu: $CONFIG_DIR"
fi

printf '\nWebPanel kaldırıldı. Docker iş yükleri ve volume\047ler korunmuştur.\n'
