#!/bin/bash
# gocd-install.sh - GoCD Server + Agent 一键安装脚本
# 适用于 Linux (aarch64/x86_64)
# 安装到当前用户目录下：~/.gocd

set -e

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

# 版本信息
GOCD_VERSION="25.4.0-21793"

# 设置安装目录
GOCD_INSTALL_DIR="$HOME/.gocd"
GOCD_SERVER_DIR="$GOCD_INSTALL_DIR/server"
GOCD_AGENT_DIR="$GOCD_INSTALL_DIR/agent"

# 检测系统架构
ARCH=$(uname -m)
case "$ARCH" in
    x86_64)
        PLATFORM="generic"
        ;;
    aarch64 | arm64)
        PLATFORM="generic"
        ;;
    *)
        echo -e "${RED}错误：不支持的架构 $ARCH${NC}"
        exit 1
        ;;
esac

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  GoCD Server + Agent 一键安装脚本${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""

# 显示版本信息
echo -e "${BLUE}版本信息:${NC}"
echo -e "  GoCD 版本：$GOCD_VERSION"
echo -e "  平台：$PLATFORM"
echo ""

# 检查是否已安装
echo -e "${YELLOW}[1/7] 检查已安装的 GoCD...${NC}"
if [ -d "$GOCD_INSTALL_DIR" ]; then
    if [ "$(ls -d $GOCD_SERVER_DIR/go-server-* 2>/dev/null | wc -l)" -gt 0 ] || [ "$(ls -d $GOCD_AGENT_DIR/go-agent-* 2>/dev/null | wc -l)" -gt 0 ]; then
        echo -e "${YELLOW}  检测到已存在的 GoCD 安装:${NC}"
        ls -d "$GOCD_SERVER_DIR/go-server-*" 2>/dev/null | while read d; do echo -e "    - Server: $d"; done
        ls -d "$GOCD_AGENT_DIR/go-agent-*" 2>/dev/null | while read d; do echo -e "    - Agent:  $d"; done
        read -p "是否覆盖安装？(y/n): " -n 1 -r REPLY
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            echo -e "${YELLOW}  安装已取消${NC}"
            exit 0
        fi
    fi
else
    echo -e "${GREEN}  未检测到 GoCD，将执行全新安装${NC}"
fi

# 创建安装目录
echo -e "${YELLOW}[2/7] 准备安装目录...${NC}"
mkdir -p "$GOCD_INSTALL_DIR"
cd "$GOCD_INSTALL_DIR"

# 创建下载目录
DOWNLOAD_DIR="$GOCD_INSTALL_DIR/downloads"
mkdir -p "$DOWNLOAD_DIR"
cd "$DOWNLOAD_DIR"

# 下载 GoCD Server
echo -e "${YELLOW}[3/7] 下载 GoCD Server...${NC}"
SERVER_FILE="go-server-25.4.0-21793.zip"
SERVER_URL="https://download.gocd.org/binaries/25.4.0-21793/generic/go-server-25.4.0-21793.zip"

if [ -f "$SERVER_FILE" ]; then
    echo -e "${YELLOW}  文件已存在，跳过下载${NC}"
else
    echo -e "${BLUE}  正在下载 Server ($SERVER_FILE)...${NC}"
    if ! curl -LO --fail --connect-timeout 30 --max-time 600 "$SERVER_URL"; then
        echo -e "${RED}  错误：下载失败${NC}"
        exit 1
    fi
    echo -e "${GREEN}  下载完成${NC}"
fi

# 下载 GoCD Agent
echo -e "${YELLOW}[4/7] 下载 GoCD Agent...${NC}"
AGENT_FILE="go-agent-25.4.0-21793.zip"
AGENT_URL="https://download.gocd.org/binaries/25.4.0-21793/generic/go-agent-25.4.0-21793.zip"

if [ -f "$AGENT_FILE" ]; then
    echo -e "${YELLOW}  文件已存在，跳过下载${NC}"
else
    echo -e "${BLUE}  正在下载 Agent ($AGENT_FILE)...${NC}"
    if ! curl -LO --fail --connect-timeout 30 --max-time 600 "$AGENT_URL"; then
        echo -e "${RED}  错误：下载失败${NC}"
        exit 1
    fi
    echo -e "${GREEN}  下载完成${NC}"
fi

# 解压 Server
echo -e "${YELLOW}[5/7] 解压并安装 GoCD Server...${NC}"

# 创建 server 目录
mkdir -p "$GOCD_SERVER_DIR"

# 解压到临时目录
TEMP_EXTRACT_DIR="$GOCD_INSTALL_DIR/temp-extract"
mkdir -p "$TEMP_EXTRACT_DIR"

if ! unzip -q "$SERVER_FILE" -d "$TEMP_EXTRACT_DIR"; then
    echo -e "${RED}  错误：解压 Server 失败${NC}"
    rm -rf "$TEMP_EXTRACT_DIR"
    exit 1
fi

# 查找解压后的实际目录名 (zip 包里可能是 go-server-25.4.0 或 go-server-25.4.0-21793)
echo -e "${BLUE}  解压目录内容：$(ls -la "$TEMP_EXTRACT_DIR")${NC}"
SERVER_EXTRACTED_DIR=$(ls -d "$TEMP_EXTRACT_DIR"/go-server-* 2>/dev/null | head -1)

if [ -z "$SERVER_EXTRACTED_DIR" ] || [ ! -d "$SERVER_EXTRACTED_DIR" ]; then
    echo -e "${RED}  错误：找不到解压后的 Server 目录${NC}"
    echo -e "  临时目录内容：$(ls -la "$TEMP_EXTRACT_DIR")"
    rm -rf "$TEMP_EXTRACT_DIR"
    exit 1
fi

echo -e "${BLUE}  找到解压目录：$SERVER_EXTRACTED_DIR${NC}"

# 保存实际目录名（避免临时目录被删除后找不到）
ACTUAL_SERVER_DIR=$(basename "$SERVER_EXTRACTED_DIR")

# 移动到正确位置
mv "$SERVER_EXTRACTED_DIR" "$GOCD_SERVER_DIR/"
echo -e "${GREEN}  Server 安装完成：$GOCD_SERVER_DIR/$ACTUAL_SERVER_DIR${NC}"

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

# 解压 Agent
echo -e "${YELLOW}[6/7] 解压并安装 GoCD Agent...${NC}"

# 创建 agent 目录
mkdir -p "$GOCD_AGENT_DIR"

# 解压到临时目录
TEMP_EXTRACT_DIR="$GOCD_INSTALL_DIR/temp-extract"
mkdir -p "$TEMP_EXTRACT_DIR"

if ! unzip -q "$AGENT_FILE" -d "$TEMP_EXTRACT_DIR"; then
    echo -e "${RED}  错误：解压 Agent 失败${NC}"
    rm -rf "$TEMP_EXTRACT_DIR"
    exit 1
fi

# 查找解压后的实际目录名
echo -e "${BLUE}  解压目录内容：$(ls -la "$TEMP_EXTRACT_DIR")${NC}"
AGENT_EXTRACTED_DIR=$(ls -d "$TEMP_EXTRACT_DIR"/go-agent-* 2>/dev/null | head -1)

if [ -z "$AGENT_EXTRACTED_DIR" ] || [ ! -d "$AGENT_EXTRACTED_DIR" ]; then
    echo -e "${RED}  错误：找不到解压后的 Agent 目录${NC}"
    echo -e "  临时目录内容：$(ls -la "$TEMP_EXTRACT_DIR")"
    rm -rf "$TEMP_EXTRACT_DIR"
    exit 1
fi

echo -e "${BLUE}  找到解压目录：$AGENT_EXTRACTED_DIR${NC}"

# 获取实际目录名 (在移动前获取)
ACTUAL_AGENT_DIR=$(basename "$AGENT_EXTRACTED_DIR")

# 移动到正确位置
mv "$AGENT_EXTRACTED_DIR" "$GOCD_AGENT_DIR/"

echo -e "${GREEN}  Agent 安装完成：$GOCD_AGENT_DIR/$ACTUAL_AGENT_DIR${NC}"

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

# 清理下载文件
echo -e "${BLUE}  清理临时文件...${NC}"
rm -f "$DOWNLOAD_DIR/$SERVER_FILE"
rm -f "$DOWNLOAD_DIR/$AGENT_FILE"

# 设置执行权限
echo -e "${BLUE}  设置执行权限...${NC}"
chmod +x "$GOCD_SERVER_DIR/$ACTUAL_SERVER_DIR/bin/go-server"
chmod +x "$GOCD_AGENT_DIR/$ACTUAL_AGENT_DIR/bin/go-agent"

# 创建符号链接
echo -e "${BLUE}  创建符号链接...${NC}"
cd "$GOCD_SERVER_DIR"
ln -sf "$(basename "$ACTUAL_SERVER_DIR")" "current"
cd "$GOCD_AGENT_DIR"
ln -sf "$(basename "$ACTUAL_AGENT_DIR")" "current"
echo -e "${GREEN}  Server 符号链接：current -> $(basename "$ACTUAL_SERVER_DIR")${NC}"
echo -e "${GREEN}  Agent 符号链接：current -> $(basename "$ACTUAL_AGENT_DIR")${NC}"

# 验证安装
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  安装完成！${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""

echo -e "GoCD 安装信息:"
echo -e "  安装目录：${YELLOW}$GOCD_INSTALL_DIR${NC}"
echo ""
echo -e "  Server:   ${YELLOW}$ACTUAL_SERVER_DIR${NC}"
echo -e "  Agent:    ${YELLOW}$ACTUAL_AGENT_DIR${NC}"
echo ""
echo -e "  Server 快捷启动：cd ~/.gocd/server/current && ./bin/go"
echo -e "  Agent 快捷启动：cd ~/.gocd/agent/current && ./bin/go-agent"
echo ""

echo -e "${GREEN}提示:${NC}"
echo -e "  1. 首次启动 Server 后，可通过浏览器访问 http://localhost:8153"
echo -e "  2. Agent 需要配置后才能连接到 Server"
echo -e "  3. 详细配置请参考官方文档:"
echo -e "     - Server: https://docs.gocd.org/current/installation/install/server/zip.html"
echo -e "     - Agent:  https://docs.gocd.org/current/installation/install/agent/zip.html"
echo ""
echo -e "需要帮助？运行 ./bin/go --help 或 ./bin/go-agent --help"
echo ""
