#!/bin/bash

set -e

msg_err() {
    echo "Error: $1" >&2
    echo "Please refer to https://iwiki.woa.com/p/4015781670" >&2
    exit 1
}

# 尝试删除单个文件（best-effort，失败只告警不中断卸载）
try_remove_file() {
    local f="$1"
    [[ -z "$f" ]] && return 0
    if [[ -e "$f" || -L "$f" ]]; then
        if ! rm -f "$f" 2>/dev/null; then
            echo "Warning: failed to remove $f, please remove it manually." >&2
        fi
    fi
}

# 尝试删除空目录（非空/失败时静默跳过，交由 rpm 或用户处理）
try_remove_dir_if_empty() {
    local d="$1"
    [[ -z "$d" || ! -d "$d" ]] && return 0
    if rmdir "$d" 2>/dev/null; then
        echo "Info: removed empty extra dir $d"
    fi
}

# 从 agent 配置解析运行期文件的实际输出路径（用户可能改到非默认位置）。
# 仅输出 shell 变量赋值，供 eval 使用；无配置文件时不输出，走默认值。
parse_conf_paths() {
    [[ -f "$CONF_FILE" ]] || return 0
    awk '
        /^[a-z_]+:/ { top=$0; sub(/:.*/, "", top); inlog=0 }
        top=="global" && /^  log:[[:space:]]*$/ { inlog=1 }
        inlog && /^    file_path:/ {
            v=$0; sub(/^[^:]*:[[:space:]]*/, "", v); gsub(/"/, "", v); sub(/[[:space:]]+#.*$/, "", v); log_path=v
        }
        top=="parser" && /^  output_dir:/ {
            v=$0; sub(/^[^:]*:[[:space:]]*/, "", v); gsub(/"/, "", v); sub(/[[:space:]]+#.*$/, "", v); parser_dir=v
        }
        top=="delay_export" && /^  output_dir:/ {
            v=$0; sub(/^[^:]*:[[:space:]]*/, "", v); gsub(/"/, "", v); sub(/[[:space:]]+#.*$/, "", v); export_dir=v
        }
        END {
            printf "CONF_LOG_FILE_PATH=%s\n", log_path
            printf "CONF_PARSER_OUTPUT_DIR=%s\n", parser_dir
            printf "CONF_EXPORT_OUTPUT_DIR=%s\n", export_dir
        }
    ' "$CONF_FILE" 2>/dev/null
}

# 清理 agent 运行期产生、但 rpm spec 未跟踪的额外文件/目录。
# rpm spec 跟踪的是：/usr/lib/nbs、/usr/bin/nbs*、/usr/bin/nbsctl、/usr/bin/nbsparser、
# /opt/nbs_agent、/etc/nbs_agent.conf。agent 运行时还会按配置生成日志、统计结果、
# 环形日志等文件，这些文件不属于 rpm，卸载 rpm 时不会被删除，且会导致 /opt/nbs_agent
# 目录非空而无法被移除，因此在此显式清理。
cleanup_extra_files() {
    eval "$(parse_conf_paths)"
    local log_path="${CONF_LOG_FILE_PATH:-$NBS_HOME/agent.log}"
    local parser_dir="${CONF_PARSER_OUTPUT_DIR:-$NBS_HOME/}"
    local export_dir="${CONF_EXPORT_OUTPUT_DIR:-$NBS_HOME/export}"

    # 1) 日志文件及其轮转备份（命名为 base.N.ext，如 agent.1.log）
    try_remove_file "$log_path"
    if [[ "$log_path" == *.* ]]; then
        local base="${log_path%.*}"
        local ext=".${log_path##*.}"
        local bak
        for bak in "$base".[0-9]*"$ext"; do
            if [[ -e "$bak" ]]; then
                try_remove_file "$bak"
            fi
        done
    fi

    # 2) parser 统计结果文件（result 及轮转产生的 result.old）
    try_remove_file "$parser_dir/result"
    try_remove_file "$parser_dir/result.old"

    # 3) delay_export 环形日志文件及导出目录
    try_remove_file "$export_dir/exceed_ring.log"
    try_remove_dir_if_empty "$export_dir"
}

# Variables
TARGET_SERVICE="nbs_agent.service"
TARGET_SERVICE_FILE="/usr/lib/systemd/system/$TARGET_SERVICE"
NBS_SYSCTL_KEY="net.nbs.enable_nbs"
NBS_MODULE="nbs"
CONF_FILE="/etc/nbs_agent.conf"
NBS_HOME="/opt/nbs_agent"

# Check for root privileges
if [[ $EUID -ne 0 ]]; then
    msg_err "Please run this script as root."
fi

# Uninstall agent service
if [[ -f "$TARGET_SERVICE_FILE" ]]; then
    # Stop the service if running
    if systemctl is-active --quiet "$TARGET_SERVICE"; then
        systemctl stop "$TARGET_SERVICE" || msg_err "Failed to stop $TARGET_SERVICE."
    fi

    # Disable the service if enabled
    if systemctl is-enabled --quiet "$TARGET_SERVICE"; then
        systemctl disable "$TARGET_SERVICE" || msg_err "Failed to disable $TARGET_SERVICE."
    fi

    # Remove the service file
    rm -f "$TARGET_SERVICE_FILE" || msg_err "Failed to remove $TARGET_SERVICE_FILE."

    # Reload systemd
    systemctl daemon-reload || msg_err "Failed to reload systemd daemon."
fi

# 清空现有规则
NBSCTL_BIN="/usr/bin/nbsctl"
if [[ ! -x "$NBSCTL_BIN" ]]; then
    msg_err "$NBSCTL_BIN not found or not executable. New NBS module required."
fi
if [ -e /dev/nbs ]; then
    "$NBSCTL_BIN" flush
    echo "Info: nbsctl rules flushed."
fi

# Disable sysctl key if exists
if sysctl -a 2>/dev/null | grep -q "^$NBS_SYSCTL_KEY"; then
    sysctl -w $NBS_SYSCTL_KEY=0 >/dev/null 2>&1 || msg_err "Failed to disable $NBS_SYSCTL_KEY."
fi

# Unload kernel module if loaded
if lsmod | grep -q "^$NBS_MODULE"; then
    rmmod $NBS_MODULE || msg_err "Failed to unload kernel module $NBS_MODULE."
fi

# 清理 agent 运行期生成、rpm 未跟踪的额外文件/目录（服务已停止后再删，避免竞态）
cleanup_extra_files

exit 0
