#!/bin/bash

# 版本校验脚本
# 比较本地 LATEST_VERSION 与 FTP 的 VERSION 版本，如果不一致则更新对应版本

set -e

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

# 日志函数 - 输出到 stderr 避免影响函数返回值
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1" >&2
}

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

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

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

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 动态获取当前版本目录
get_current_version_dir() {
    # 查找 /opt/argus-metric/versions/ 下的最新版本目录
    local versions_dir="/opt/argus-metric/versions"
    if [[ -d "$versions_dir" ]]; then
        # 按版本号排序，获取最新的版本目录
        local latest_version_dir=$(ls -1 "$versions_dir" 2>/dev/null | sort -V | tail -1)
        if [[ -n "$latest_version_dir" ]]; then
            echo "$versions_dir/$latest_version_dir"
        else
            echo "/opt/argus-metric"
        fi
    else
        echo "/opt/argus-metric"
    fi
}

# 获取当前版本目录
CURRENT_VERSION_DIR=$(get_current_version_dir)
# LATEST_VERSION 文件在根目录
LOCAL_VERSION_FILE="/opt/argus-metric/LATEST_VERSION"
REMOTE_VERSION_URL=""
LOG_FILE="$CURRENT_VERSION_DIR/.version_check.log"

# 从环境变量或配置文件获取 FTP 服务器信息
get_ftp_config() {
    # 优先从环境变量获取配置
    log_info "获取 FTP 配置信息..."
    
    # 如果环境变量中没有设置，则尝试从配置文件读取
    if [[ -z "$FTP_SERVER" || -z "$FTP_USER" || -z "$FTP_PASSWORD" ]]; then
        local config_file="$SCRIPT_DIR/../config/config.env"
        if [[ -f "$config_file" ]]; then
            log_info "从配置文件读取 FTP 配置: $config_file"
            source "$config_file"
        fi
    else
        log_info "使用环境变量中的 FTP 配置"
    fi
    
    # 设置默认值（如果环境变量和配置文件都没有设置）
    FTP_SERVER="${FTP_SERVER:-localhost}"
    FTP_USER="${FTP_USER:-ftpuser}"
    FTP_PASSWORD="${FTP_PASSWORD:-ZGClab1234!}"
    
    # 构建远程版本文件 URL
    REMOTE_VERSION_URL="ftp://${FTP_USER}:${FTP_PASSWORD}@${FTP_SERVER}/LATEST_VERSION"
    
    log_info "FTP 配置来源: ${FTP_CONFIG_SOURCE:-环境变量/配置文件}"
}

# 获取远程版本号
get_remote_version() {
    log_info "从 FTP 服务器获取远程版本号..."
    log_info "远程地址: $REMOTE_VERSION_URL"
    
    # 先测试 FTP 连接
    log_info "测试 FTP 连接..."
    if curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfI "ftp://${FTP_SERVER}/" >/dev/null 2>&1; then
        log_success "FTP 服务器连接成功"
    else
        log_error "无法连接到 FTP 服务器: $FTP_SERVER"
        return 1
    fi
    
    # 测试 LATEST_VERSION 文件是否存在
    log_info "检查远程 LATEST_VERSION 文件是否存在..."
    if curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfI "ftp://${FTP_SERVER}/LATEST_VERSION" >/dev/null 2>&1; then
        log_success "远程 LATEST_VERSION 文件存在"
    else
        log_error "远程 LATEST_VERSION 文件不存在或无法访问"
        return 1
    fi
    
    # 获取远程版本号
    local remote_version
    if remote_version=$(curl -u "${FTP_USER}:${FTP_PASSWORD}" -sfL "ftp://${FTP_SERVER}/LATEST_VERSION" 2>/dev/null | tr -d '[:space:]'); then
        if [[ -n "$remote_version" ]]; then
            log_success "获取到远程版本号: $remote_version"
            echo "$remote_version"
        else
            log_error "远程版本号为空"
            return 1
        fi
    else
        log_error "获取远程版本号失败"
        return 1
    fi
}

# 获取本地版本号
get_local_version() {
    if [[ -f "$LOCAL_VERSION_FILE" ]]; then
        local local_version=$(cat "$LOCAL_VERSION_FILE" 2>/dev/null | tr -d '[:space:]')
        if [[ -n "$local_version" ]]; then
            log_info "本地版本号: $local_version"
            echo "$local_version"
        else
            log_warning "本地版本文件为空"
            echo ""
        fi
    else
        log_warning "本地版本文件不存在: $LOCAL_VERSION_FILE"
        echo ""
    fi
}

# 更新到新版本
update_to_version() {
    local new_version="$1"
    local temp_dir="/tmp/argus-update-$$"
    local setup_script="$temp_dir/setup.sh"
    
    log_info "开始更新到版本: $new_version"
    
    # 创建临时目录
    mkdir -p "$temp_dir"
    
    # 下载最新的 setup.sh
    log_info "从 FTP 服务器下载最新的安装脚本..."
    local setup_url="ftp://${FTP_USER}:${FTP_PASSWORD}@${FTP_SERVER}/setup.sh"
    
    if curl -fsS "$setup_url" -o "$setup_script"; then
        log_success "安装脚本下载完成"
    else
        log_error "下载安装脚本失败: $setup_url"
        rm -rf "$temp_dir"
        return 1
    fi
    
    # 添加执行权限
    chmod +x "$setup_script"
    
    # 执行安装脚本
    log_info "执行安装脚本进行版本更新..."
    if "$setup_script" --server "$FTP_SERVER" --user "$FTP_USER" --password "$FTP_PASSWORD" --version "$new_version"; then
        log_success "版本更新完成: $new_version"
        rm -rf "$temp_dir"
        return 0
    else
        log_error "版本更新失败: $new_version"
        rm -rf "$temp_dir"
        return 1
    fi
}

# 记录检查日志
log_check() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $message" >> "$LOG_FILE"
}

# 主函数
main() {
    log_info "开始版本校验检查..."
    log_check "版本校验检查开始"
    
    # 确保系统目录存在
    mkdir -p "/opt/argus-metric"
    mkdir -p "$CURRENT_VERSION_DIR"
    
    log_info "当前版本目录: $CURRENT_VERSION_DIR"
    
    # 获取 FTP 配置
    get_ftp_config
    
    # 获取本地版本号
    local local_version
    local_version=$(get_local_version)
    
    # 获取远程版本号
    local remote_version
    if ! remote_version=$(get_remote_version); then
        log_error "无法获取远程版本号，跳过本次检查"
        log_check "版本校验失败：无法获取远程版本号"
        exit 1
    fi
    
    # 比较版本号
    if [[ "$local_version" == "$remote_version" ]]; then
        log_info "版本一致，无需更新 (本地: $local_version, 远程: $remote_version)"
        log_check "版本校验完成：版本一致 ($local_version)"
    else
        log_info "检测到版本不一致 (本地: $local_version, 远程: $remote_version)"
        log_check "检测到版本不一致：本地($local_version) -> 远程($remote_version)"
        
        # 更新到新版本
        if update_to_version "$remote_version"; then
            log_success "版本更新成功: $local_version -> $remote_version"
            log_check "版本更新成功：$local_version -> $remote_version"
        else
            log_error "版本更新失败"
            log_check "版本更新失败：$local_version -> $remote_version"
            exit 1
        fi
    fi
    
    log_success "版本校验检查完成"
    log_check "版本校验检查完成"
}

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