#!/bin/bash

# ============================================
# LinkMaster Node Vendor 依赖打包脚本
# 用途：将项目依赖下载到 vendor 目录，客户端克隆后可直接编译，无需网络
# 使用方法: ./vendor.sh
# ============================================

set -e

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

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

# 检查 Go 环境
check_go() {
    if ! command -v go > /dev/null 2>&1; then
        echo -e "${RED}错误: 未找到 Go 环境${NC}"
        echo -e "${YELLOW}请先安装 Go: https://golang.org/dl/${NC}"
        exit 1
    fi
    
    GO_VERSION=$(go version 2>/dev/null | head -1)
    echo -e "${GREEN}✓ 检测到 Go: ${GO_VERSION}${NC}"
}

# 配置 Go 环境（海外网络，直接使用官方源）
setup_go_env() {
    echo -e "${BLUE}配置 Go 环境（使用官方源）...${NC}"
    
    # 海外网络可以直接使用官方源，无需代理
    # 使用官方 Go 代理和校验和数据库
    export GOPROXY="https://proxy.golang.org,direct"
    export GOSUMDB="sum.golang.org"
    
    # 使用 go env -w 永久设置
    go env -w GOPROXY="https://proxy.golang.org,direct" 2>/dev/null || true
    go env -w GOSUMDB="sum.golang.org" 2>/dev/null || true
    
    echo -e "${GREEN}✓ Go 环境配置完成（使用官方源）${NC}"
    echo -e "${BLUE}  GOPROXY=https://proxy.golang.org,direct${NC}"
    echo -e "${BLUE}  GOSUMDB=sum.golang.org${NC}"
}

# 下载依赖
download_dependencies() {
    echo -e "${BLUE}下载 Go 依赖包...${NC}"
    
    # 先整理依赖
    echo -e "${BLUE}整理 Go 模块依赖...${NC}"
    if ! go mod tidy -v 2>&1; then
        echo -e "${YELLOW}⚠ go mod tidy 失败，继续尝试下载依赖...${NC}"
    fi
    
    # 下载依赖
    echo -e "${BLUE}下载所有依赖包（这可能需要一些时间）...${NC}"
    DOWNLOAD_START_TIME=$(date +%s)
    
    if go mod download -x 2>&1; then
        DOWNLOAD_END_TIME=$(date +%s)
        DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
        echo -e "${GREEN}✓ 依赖下载完成 (耗时: ${DOWNLOAD_DURATION}秒)${NC}"
    else
        echo -e "${RED}✗ 依赖下载失败${NC}"
        exit 1
    fi
}

# 创建 vendor 目录
create_vendor() {
    echo -e "${BLUE}创建 vendor 目录（打包所有依赖）...${NC}"
    
    # 删除旧的 vendor 目录（如果存在）
    if [ -d "vendor" ]; then
        echo -e "${YELLOW}清理旧的 vendor 目录...${NC}"
        rm -rf vendor
    fi
    
    # 创建 vendor 目录
    if go mod vendor -v 2>&1; then
        VENDOR_COUNT=$(find vendor -type d -mindepth 2 2>/dev/null | wc -l | tr -d '\n' || echo "0")
        VENDOR_COUNT=${VENDOR_COUNT:-0}
        
        # 计算 vendor 目录大小
        VENDOR_SIZE=$(du -sh vendor 2>/dev/null | cut -f1 || echo "未知")
        
        echo -e "${GREEN}✓ vendor 目录创建成功${NC}"
        echo -e "${BLUE}统计信息:${NC}"
        echo -e "  依赖包数量: ${GREEN}${VENDOR_COUNT}${NC}"
        echo -e "  目录大小: ${GREEN}${VENDOR_SIZE}${NC}"
    else
        echo -e "${RED}✗ vendor 创建失败${NC}"
        exit 1
    fi
}

# 更新 .gitignore
update_gitignore() {
    echo -e "${BLUE}更新 .gitignore...${NC}"
    
    if [ ! -f ".gitignore" ]; then
        echo -e "${BLUE}创建 .gitignore 文件...${NC}"
        touch .gitignore
    fi
    
    # 检查 .gitignore 是否忽略了 vendor
    if grep -q "^vendor$" .gitignore 2>/dev/null || grep -q "^vendor/" .gitignore 2>/dev/null; then
        echo -e "${YELLOW}⚠ 检测到 .gitignore 中忽略了 vendor 目录${NC}"
        echo -e "${BLUE}正在更新 .gitignore，允许 vendor 目录被提交...${NC}"
        # 移除 vendor 相关的忽略规则
        sed -i.bak '/^vendor$/d; /^vendor\//d' .gitignore 2>/dev/null || \
        sed -i '' '/^vendor$/d; /^vendor\//d' .gitignore 2>/dev/null || true
        rm -f .gitignore.bak 2>/dev/null || true
        echo -e "${GREEN}✓ 已更新 .gitignore${NC}"
    else
        echo -e "${GREEN}✓ .gitignore 配置正确${NC}"
    fi
}

# 添加到 Git（可选）
add_to_git() {
    if [ -d ".git" ]; then
        echo -e "${BLUE}将 vendor 目录添加到 Git...${NC}"
        
        # 检查是否有未提交的更改
        if git status --porcelain vendor 2>/dev/null | grep -q vendor; then
            git add vendor/ 2>/dev/null || true
            echo -e "${GREEN}✓ vendor 目录已添加到 Git 暂存区${NC}"
            echo -e "${YELLOW}提示: 请运行 'git commit -m \"chore: add vendor dependencies\"' 提交 vendor 目录${NC}"
        else
            echo -e "${BLUE}vendor 目录已在 Git 中${NC}"
        fi
    else
        echo -e "${YELLOW}⚠ 当前目录不是 Git 仓库，跳过 Git 操作${NC}"
    fi
}

# 显示进度显示
show_progress() {
    echo -e "${BLUE}正在下载依赖包，显示进度...${NC}"
    
    # 使用后台进程显示进度
    (
        DOWNLOADED_COUNT=0
        LAST_COUNT=0
        LAST_PACKAGE=""
        START_TIME=$(date +%s)
        
        while true; do
            sleep 1
            
            # 从 go mod download 的输出中统计
            CURRENT_COUNT=$(ps aux | grep -c "[g]o mod download" || echo "0")
            
            # 检查进程是否还在运行
            if ! pgrep -f "go mod download" > /dev/null 2>&1; then
                break
            fi
            
            CURRENT_TIME=$(date +%s)
            ELAPSED=$((CURRENT_TIME - START_TIME))
            
            if [ "$ELAPSED" -gt 0 ]; then
                echo -ne "\r${BLUE}进度: 下载中... | 耗时: ${ELAPSED}秒    "
            fi
        done
    ) &
    PROGRESS_PID=$!
    
    # 等待下载完成
    wait $PROGRESS_PID 2>/dev/null || true
}

# 主函数
main() {
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  LinkMaster Node Vendor 依赖打包工具${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
    
    # 检查是否在项目根目录
    if [ ! -f "go.mod" ]; then
        echo -e "${RED}错误: 未找到 go.mod 文件${NC}"
        echo -e "${YELLOW}请在项目根目录运行此脚本${NC}"
        exit 1
    fi
    
    check_go
    setup_go_env
    download_dependencies
    create_vendor
    update_gitignore
    add_to_git
    
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  ✓ Vendor 依赖打包完成！${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
    echo -e "${BLUE}下一步操作:${NC}"
    echo "  1. 检查 vendor 目录: ls -lh vendor/"
    echo "  2. 提交到 Git: git add vendor/ && git commit -m \"chore: add vendor dependencies\""
    echo "  3. 推送到远程: git push"
    echo ""
    echo -e "${BLUE}客户端使用:${NC}"
    echo "  客户端克隆项目后，可以使用以下命令编译（无需网络）:"
    echo "  go build -mod=vendor -o agent ./cmd/agent"
    echo ""
}

# 执行主函数
main

