#!/bin/bash

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 配置变量
INSTALL_DIR="/opt/argus-metric"
TEMP_DIR="/tmp/argus-metric-uninstall-$$"
VERSION_FILE="version.json"

# 检查是否为 root 用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要 root 权限运行"
        log_info "请使用: sudo $0"
        exit 1
    fi
}

# 查找版本文件
find_version_file() {
    log_info "查找版本信息文件..."
    
    # 在当前目录查找
    if [[ -f "$VERSION_FILE" ]]; then
        VERSION_FILE_PATH="$VERSION_FILE"
        log_success "找到版本文件: $VERSION_FILE"
        return 0
    fi
    
    # 在 artifact 目录查找
    for version_dir in artifact/*/; do
        if [[ -f "${version_dir}${VERSION_FILE}" ]]; then
            VERSION_FILE_PATH="${version_dir}${VERSION_FILE}"
            log_success "找到版本文件: $VERSION_FILE_PATH"
            return 0
        fi
    done
    
    log_error "未找到版本信息文件 $VERSION_FILE"
    log_info "请确保在正确的目录下运行此脚本"
    exit 1
}

# 解析版本信息
parse_version_info() {
    log_info "解析版本信息..."
    
    if [[ ! -f "$VERSION_FILE_PATH" ]]; then
        log_error "版本文件不存在: $VERSION_FILE_PATH"
        exit 1
    fi
    
    # 使用 jq 解析 JSON（如果可用）
    if command -v jq &> /dev/null; then
        VERSION=$(jq -r '.version' "$VERSION_FILE_PATH")
        BUILD_TIME=$(jq -r '.build_time' "$VERSION_FILE_PATH")
        
        # 解析 install_order（现在包含完整的文件名）
        if jq -e '.install_order' "$VERSION_FILE_PATH" > /dev/null 2>&1; then
            jq -r '.install_order[]' "$VERSION_FILE_PATH" > "$TEMP_DIR/install_order.txt"
        else
            log_error "version.json 中缺少 install_order 字段"
            exit 1
        fi
    else
        log_warning "jq 未安装，使用简单的 JSON 解析"
        VERSION=$(grep '"version"' "$VERSION_FILE_PATH" | sed 's/.*"version": *"\([^"]*\)".*/\1/')
        BUILD_TIME=$(grep '"build_time"' "$VERSION_FILE_PATH" | sed 's/.*"build_time": *"\([^"]*\)".*/\1/')
        
        # 解析 install_order
        grep -A 100 '"install_order"' "$VERSION_FILE_PATH" | grep -E '^\s*"[^"]+"' | while read line; do
            component=$(echo "$line" | sed 's/.*"\([^"]*\)".*/\1/')
            echo "$component" >> "$TEMP_DIR/install_order.txt"
        done
    fi
    
    log_success "版本信息解析完成"
    log_info "  版本: $VERSION"
    log_info "  构建时间: $BUILD_TIME"
}

# 创建临时目录
create_temp_dirs() {
    log_info "创建临时目录..."
    mkdir -p "$TEMP_DIR"
    log_success "临时目录创建完成: $TEMP_DIR"
}

# 卸载组件
uninstall_components() {
    log_info "开始卸载组件..."
    
    artifact_dir=$(dirname "$VERSION_FILE_PATH")
    uninstall_count=0
    total_count=0
    
    if [[ -f "$TEMP_DIR/install_order.txt" ]]; then
        total_count=$(wc -l < "$TEMP_DIR/install_order.txt")
    fi
    
    if [[ -f "$TEMP_DIR/install_order.txt" ]]; then
        while IFS= read -r filename; do
            uninstall_count=$((uninstall_count + 1))
            
            # 从文件名中提取组件名（去掉时间戳后缀）
            component=$(echo "$filename" | sed 's/-[0-9]\{8\}-[0-9]\{6\}\.tar\.gz$//')
            
            log_info "[$uninstall_count/$total_count] 卸载 $component..."
            
            # 直接使用完整的文件名
            tar_file="$artifact_dir/$filename"
            
            if [[ ! -f "$tar_file" ]]; then
                log_error "找不到组件文件: $filename"
                exit 1
            fi
            
            # 解压到临时目录
            component_temp_dir="$TEMP_DIR/$component"
            mkdir -p "$component_temp_dir"
            
            if tar -xzf "$tar_file" -C "$component_temp_dir"; then
                log_success "  $component 解压完成"
            else
                log_error "  $component 解压失败"
                exit 1
            fi
            
            # 查找解压后的目录
            extracted_dir=""
            for dir in "$component_temp_dir"/*; do
                if [[ -d "$dir" ]]; then
                    extracted_dir="$dir"
                    break
                fi
            done
            
            if [[ -z "$extracted_dir" ]]; then
                log_error "  $component 解压后未找到目录"
                exit 1
            fi
            
            # 执行卸载脚本
            if [[ -f "$extracted_dir/uninstall.sh" ]]; then
                log_info "  执行 $component 卸载脚本..."
                # 所有组件都只需要一个确认
                if (cd "$extracted_dir" && echo "y" | ./uninstall.sh); then
                    log_success "  $component 卸载完成"
                else
                    log_error "  $component 卸载失败"
                    exit 1
                fi
            else
                log_warning "  $component 缺少 uninstall.sh 文件，跳过卸载"
            fi
            
            # 清理临时文件
            rm -rf "$component_temp_dir"
        done < "$TEMP_DIR/install_order.txt"
    fi
    
    log_success "所有组件卸载完成"
}

# 清理全局文件
cleanup_global_files() {
    log_info "清理全局文件..."
    
    # 清理安装目录
    if [[ -d "$INSTALL_DIR" ]]; then
        rm -rf "$INSTALL_DIR"
        log_success "安装目录已清理: $INSTALL_DIR"
    else
        log_info "安装目录不存在: $INSTALL_DIR"
    fi
    
    # 清理可能的全局配置文件
    local global_configs=(
        "/etc/argus-metric"
        "/var/log/argus-metric"
    )
    
    for config in "${global_configs[@]}"; do
        if [[ -d "$config" ]]; then
            rm -rf "$config"
            log_success "全局配置已清理: $config"
        fi
    done
}

# 显示卸载信息
show_uninstall_info() {
    log_success "Argus-Metrics All-in-One 卸载完成！"
    echo
    echo "卸载信息:"
    echo "  版本: $VERSION"
    echo "  构建时间: $BUILD_TIME"
    echo
    echo "清理内容:"
    echo "  - 二进制文件"
    echo "  - 配置文件"
    echo "  - 数据目录"
    echo "  - 进程和服务"
    echo "  - 全局安装目录"
    echo
    echo "注意:"
    echo "  - 系统依赖包可能仍然存在"
    echo "  - 如需完全清理，请手动检查并删除相关文件"
    echo
}

# 清理函数
cleanup() {
    if [[ -d "$TEMP_DIR" ]]; then
        rm -rf "$TEMP_DIR"
    fi
}

# 设置清理陷阱
trap cleanup EXIT

# 主函数
main() {
    echo "=========================================="
    echo "    Argus-Metrics All-in-One 卸载脚本"
    echo "=========================================="
    echo
    
    check_root
    find_version_file
    create_temp_dirs
    parse_version_info
    
    log_warning "此操作将完全卸载 Argus-Metrics All-in-One"
    read -p "确认继续？(y/N): " confirm
    
    if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
        log_info "取消卸载操作"
        exit 0
    fi
    
    uninstall_components
    cleanup_global_files
    show_uninstall_info
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi