#!/bin/bash

set -e

# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
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"
}

# 显示帮助信息
show_help() {
    echo "Argus-Metric Artifact 发布脚本"
    echo
    echo "用法: $0 <版本号> [选项]"
    echo
    echo "参数:"
    echo "  <版本号>              要发布的版本号，对应 artifact 目录中的版本"
    echo
    echo "选项:"
    echo "  --output-dir <路径>   指定输出目录 (默认: /private/argus/ftp/share/)"
    echo "  --owner <uid:gid>     指定文件所有者 (默认: 2133:2015)"
    echo "  -h, --help           显示此帮助信息"
    echo
    echo "示例:"
    echo "  $0 1.20.0                                    # 使用默认配置发布"
    echo "  $0 1.20.0 --output-dir /tmp/publish          # 指定输出目录"
    echo "  $0 1.20.0 --owner 1000:1000                  # 指定文件所有者"
    echo "  $0 1.20.0 --output-dir /srv/ftp --owner root:root  # 同时指定两者"
    echo
}

# 默认配置
DEFAULT_PUBLISH_DIR="/private/argus/ftp/share/"
DEFAULT_OWNER="2133:2015"

# 解析参数
VERSION=""
PUBLISH_DIR="$DEFAULT_PUBLISH_DIR"
OWNER="$DEFAULT_OWNER"

while [[ $# -gt 0 ]]; do
    case $1 in
        -h|--help)
            show_help
            exit 0
            ;;
        --output-dir)
            PUBLISH_DIR="$2"
            shift 2
            ;;
        --owner)
            OWNER="$2"
            shift 2
            ;;
        *)
            if [[ -z "$VERSION" ]]; then
                VERSION="$1"
                shift
            else
                log_error "未知参数: $1"
                show_help
                exit 1
            fi
            ;;
    esac
done

# 检查版本号是否提供
if [[ -z "$VERSION" ]]; then
    log_error "请提供版本号参数"
    show_help
    exit 1
fi

ARTIFACT_DIR="artifact/$VERSION"

# 检查版本目录是否存在
if [[ ! -d "$ARTIFACT_DIR" ]]; then
    log_error "版本目录不存在: $ARTIFACT_DIR"
    exit 1
fi

log_info "开始发布版本: $VERSION"
log_info "输出目录: $PUBLISH_DIR"
log_info "文件所有者: $OWNER"

# 确保发布目录存在
log_info "确保发布目录存在: $PUBLISH_DIR"
mkdir -p "$PUBLISH_DIR"

IFS=':' read -r OWNER_UID OWNER_GID <<< "$OWNER"
if [[ -z "$OWNER_UID" || -z "$OWNER_GID" ]]; then
    log_error "--owner 格式不正确，应为 uid:gid"
    exit 1
fi

CURRENT_UID=$(id -u)
CURRENT_GID=$(id -g)
if [[ "$OWNER_UID" != "$CURRENT_UID" || "$OWNER_GID" != "$CURRENT_GID" ]]; then
    if [[ "$CURRENT_UID" -ne 0 ]]; then
        log_error "当前用户 (${CURRENT_UID}:${CURRENT_GID}) 无法设置所有者为 ${OWNER_UID}:${OWNER_GID}"
        log_error "请以目标用户运行脚本或预先调整目录权限"
        exit 1
    fi
    NEED_CHOWN=true
else
    NEED_CHOWN=false
fi

# 创建临时目录用于打包
TEMP_PACKAGE_DIR="/tmp/argus-metric-package-$$"
mkdir -p "$TEMP_PACKAGE_DIR"

# 复制所有 tar.gz 文件到临时目录
log_info "准备 artifact 文件..."
tar_files=$(find "$ARTIFACT_DIR" -name "*.tar.gz" -type f)

if [[ -z "$tar_files" ]]; then
    log_error "在 $ARTIFACT_DIR 中未找到 tar.gz 文件"
    exit 1
fi

for file in $tar_files; do
    filename=$(basename "$file")
    log_info "  准备: $filename"
    cp "$file" "$TEMP_PACKAGE_DIR/"
done

# 复制版本信息文件
if [[ -f "$ARTIFACT_DIR/version.json" ]]; then
    log_info "复制版本信息文件..."
    cp "$ARTIFACT_DIR/version.json" "$TEMP_PACKAGE_DIR/"
fi

# 复制健康检查脚本
if [[ -f "$ARTIFACT_DIR/check_health.sh" ]]; then
    log_info "复制健康检查脚本..."
    cp "$ARTIFACT_DIR/check_health.sh" "$TEMP_PACKAGE_DIR/"
elif [[ -f "scripts/check_health.sh" ]]; then
    log_info "复制健康检查脚本 (从当前目录)..."
    cp "scripts/check_health.sh" "$TEMP_PACKAGE_DIR/"
else
    log_warning "未找到 check_health.sh 文件"
fi

# 复制 DNS 同步脚本
if [[ -f "$ARTIFACT_DIR/sync_dns.sh" ]]; then
    log_info "复制 DNS 同步脚本..."
    cp "$ARTIFACT_DIR/sync_dns.sh" "$TEMP_PACKAGE_DIR/"
elif [[ -f "scripts/sync_dns.sh" ]]; then
    log_info "复制 DNS 同步脚本 (从当前目录)..."
    cp "scripts/sync_dns.sh" "$TEMP_PACKAGE_DIR/"
else
    log_warning "未找到 sync_dns.sh 文件"
fi

# 复制版本校验脚本
if [[ -f "$ARTIFACT_DIR/check_version.sh" ]]; then
    log_info "复制版本校验脚本..."
    cp "$ARTIFACT_DIR/check_version.sh" "$TEMP_PACKAGE_DIR/"
elif [[ -f "scripts/check_version.sh" ]]; then
    log_info "复制版本校验脚本 (从当前目录)..."
    cp "scripts/check_version.sh" "$TEMP_PACKAGE_DIR/"
else
    log_warning "未找到 check_version.sh 文件"
fi

# 复制重启失败脚本
if [[ -f "$ARTIFACT_DIR/restart_unhealthy.sh" ]]; then
    log_info "复制重启失败脚本..."
    cp "$ARTIFACT_DIR/restart_unhealthy.sh" "$TEMP_PACKAGE_DIR/"
elif [[ -f "scripts/restart_unhealthy.sh" ]]; then
    log_info "复制重启失败脚本 (从当前目录)..."
    cp "scripts/restart_unhealthy.sh" "$TEMP_PACKAGE_DIR/"
else
    log_warning "未找到 restart_unhealthy.sh 文件"
fi

# 复制安装脚本并重命名为 install.sh
if [[ -f "scripts/install_artifact.sh" ]]; then
    log_info "复制安装脚本..."
    cp "scripts/install_artifact.sh" "$TEMP_PACKAGE_DIR/install.sh"
fi

if [[ -f "scripts/uninstall_artifact.sh" ]]; then
    log_info "复制卸载脚本..."
    cp "scripts/uninstall_artifact.sh" "$TEMP_PACKAGE_DIR/uninstall.sh"
fi

# 复制配置文件
if [[ -f "$ARTIFACT_DIR/config.env" ]]; then
    log_info "复制配置文件..."
    cp "$ARTIFACT_DIR/config.env" "$TEMP_PACKAGE_DIR/"
    log_success "配置文件复制完成"
else
    log_warning "未找到 config.env 文件"
fi

# DNS 配置文件将在后面直接复制到发布目录根目录，不包含在 tar.gz 中

# 复制 deps 目录
if [[ -d "$ARTIFACT_DIR/deps" ]]; then
    log_info "复制系统依赖包..."
    cp -r "$ARTIFACT_DIR/deps" "$TEMP_PACKAGE_DIR/"
    log_success "系统依赖包复制完成"
fi

# 创建tar包，使用新的命名规范
TAR_NAME="argus-metric_$(echo $VERSION | tr '.' '_').tar.gz"
log_info "创建发布包: $TAR_NAME"
cd "$TEMP_PACKAGE_DIR"
tar -czf "$PUBLISH_DIR/$TAR_NAME" *
cd - > /dev/null

if [[ "$NEED_CHOWN" == true ]]; then
    log_info "设置文件所有者为: $OWNER"
    chown "$OWNER" "$PUBLISH_DIR/$TAR_NAME"
fi

# 清理临时目录
rm -rf "$TEMP_PACKAGE_DIR"

# 更新 LATEST_VERSION 文件
log_info "更新 LATEST_VERSION 文件..."
echo "$VERSION" > "$PUBLISH_DIR/LATEST_VERSION"
if [[ "$NEED_CHOWN" == true ]]; then
    chown "$OWNER" "$PUBLISH_DIR/LATEST_VERSION"
fi

# 复制 DNS 配置文件到发布目录根目录（直接从 config 目录复制）
if [[ -f "config/dns.conf" ]]; then
    log_info "复制 DNS 配置文件到发布目录根目录..."
    cp "config/dns.conf" "$PUBLISH_DIR/"
    if [[ "$NEED_CHOWN" == true ]]; then
        chown "$OWNER" "$PUBLISH_DIR/dns.conf"
    fi
    log_success "DNS 配置文件复制完成: $PUBLISH_DIR/dns.conf"
else
    log_warning "未找到 config/dns.conf 文件，跳过 DNS 配置文件复制"
fi

# 复制 setup.sh 到发布目录
if [[ -f "scripts/setup.sh" ]]; then
    log_info "复制 setup.sh 到发布目录..."
    cp "scripts/setup.sh" "$PUBLISH_DIR/"
    if [[ "$NEED_CHOWN" == true ]]; then
        chown "$OWNER" "$PUBLISH_DIR/setup.sh"
    fi
fi

# 显示发布结果
log_success "版本 $VERSION 发布完成！"
echo
echo "发布目录: $PUBLISH_DIR"
echo "发布包: $PUBLISH_DIR/$TAR_NAME"
echo "包大小: $(du -h "$PUBLISH_DIR/$TAR_NAME" | cut -f1)"
echo "最新版本: $(cat "$PUBLISH_DIR/LATEST_VERSION")"
echo
echo "发布目录中的文件:"
ls -la "$PUBLISH_DIR" | while read line; do
    echo "  $line"
done
echo
echo "使用方法:"
echo "  1. 确保 /srv/ftp/share 目录可通过 FTP 访问"
echo "  2. 用户首先下载安装脚本:"
echo "     curl -u ftpuser:admin1234 ftp://10.211.55.4/setup.sh -o setup.sh"
echo "  3. 然后执行安装 (自动获取最新版本):"
echo "     sudo sh setup.sh"
echo "  4. 或者指定版本安装:"
echo "     sudo sh setup.sh --version $VERSION"
echo "  5. 或者指定不同的FTP服务器:"
echo "     sudo sh setup.sh --server 192.168.1.100 --user myuser --password mypass"
