#!/bin/bash

# 脚本描述：安装Golang并设置国内代理源
# 适用环境：Linux系统（支持Ubuntu、CentOS等主流发行版）
# Go版本：1.24.2
# 下载源：阿里云镜像

# 变量定义
GO_VERSION="go1.24.2"
GO_TAR="${GO_VERSION}.linux-amd64.tar.gz"
DOWNLOAD_URL="https://mirrors.aliyun.com/golang/${GO_TAR}"
INSTALL_DIR="/usr/local"
GO_DIR="${INSTALL_DIR}/go"
TMP_DIR="/tmp"
GOPROXY_URL="https://goproxy.cn,direct"

# 颜色输出函数
print_info() {
    echo -e "\033[32m[INFO]\033[0m $1"
}

print_error() {
    echo -e "\033[31m[ERROR]\033[0m $1"
}

print_warning() {
    echo -e "\033[33m[WARNING]\033[0m $1"
}

# 检查是否为root用户或有sudo权限
check_privileges() {
    if [ "$EUID" -ne 0 ]; then
        if ! command -v sudo &> /dev/null; then
            print_error "需要root权限或sudo命令来执行安装，请以root用户运行或安装sudo。"
            exit 1
        fi
        print_warning "当前非root用户，将使用sudo执行部分命令。"
    fi
}

# 检查依赖工具
check_dependencies() {
    local deps=("wget" "tar")
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &> /dev/null; then
            print_info "安装依赖工具 $dep..."
            if [ "$EUID" -eq 0 ]; then
                apt update && apt install -y "$dep" || yum install -y "$dep" || dnf install -y "$dep"
            else
                sudo apt update && sudo apt install -y "$dep" || sudo yum install -y "$dep" || sudo dnf install -y "$dep"
            fi
            if [ $? -ne 0 ]; then
                print_error "安装 $dep 失败，请手动安装后再运行脚本。"
                exit 1
            fi
        fi
    done
}

# 下载Go安装包
download_go() {
    print_info "开始下载Golang安装包..."
    if [ -f "${TMP_DIR}/${GO_TAR}" ]; then
        print_info "安装包已存在，跳过下载。"
        return 0
    fi
    if ! wget -O "${TMP_DIR}/${GO_TAR}" "$DOWNLOAD_URL"; then
        print_error "下载Golang失败，请检查网络连接或URL是否有效。"
        exit 1
    fi
    print_info "下载完成：${TMP_DIR}/${GO_TAR}"
}

# 安装Go
install_go() {
    print_info "开始安装Golang到${INSTALL_DIR}..."
    if [ -d "$GO_DIR" ]; then
        print_warning "目录${GO_DIR}已存在，将被覆盖。"
        if [ "$EUID" -eq 0 ]; then
            rm -rf "$GO_DIR"
        else
            sudo rm -rf "$GO_DIR"
        fi
    fi
    if [ "$EUID" -eq 0 ]; then
        tar -C "$INSTALL_DIR" -xzf "${TMP_DIR}/${GO_TAR}"
    else
        sudo tar -C "$INSTALL_DIR" -xzf "${TMP_DIR}/${GO_TAR}"
    fi
    if [ $? -ne 0 ]; then
        print_error "解压安装包失败，请检查文件完整性。"
        exit 1
    fi
    print_info "Golang安装完成。"
}

# 设置环境变量
setup_env() {
    print_info "设置环境变量..."
    local profile_file=""
    if [ -f "$HOME/.bashrc" ]; then
        profile_file="$HOME/.bashrc"
    elif [ -f "$HOME/.bash_profile" ]; then
        profile_file="$HOME/.bash_profile"
    elif [ -f "$HOME/.zshrc" ]; then
        profile_file="$HOME/.zshrc"
    else
        print_warning "未找到常见的shell配置文件，将使用/etc/profile（需要root权限）。"
        profile_file="/etc/profile"
    fi

    # 检查是否已设置环境变量，避免重复添加
    if ! grep -q "/usr/local/go/bin" "$profile_file"; then
        cat >> "$profile_file" << 'EOF'

# Go environment variables
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
EOF
        print_info "环境变量已写入${profile_file}。"
    else
        print_info "环境变量已存在，跳过写入。"
    fi

    # 立即生效（仅对当前会话）
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOPATH/bin
}

# 设置Go代理
setup_proxy() {
    print_info "设置Go国内代理源..."
    if command -v go &> /dev/null; then
        go env -w GOPROXY="$GOPROXY_URL"
        if [ $? -eq 0 ]; then
            print_info "代理源已设置为：$GOPROXY_URL"
        else
            print_error "设置代理源失败，请手动运行 'go env -w GOPROXY=$GOPROXY_URL'"
        fi
    else
        print_error "Go命令未找到，代理设置失败。请检查安装是否成功。"
    fi
}

# 验证安装
verify_installation() {
    print_info "验证Golang安装..."
    if command -v go &> /dev/null; then
        go_version=$(go version)
        print_info "Golang版本：$go_version"
        goproxy=$(go env GOPROXY)
        print_info "GOPROXY设置：$goproxy"
    else
        print_error "Golang未正确安装，请检查错误信息。"
        exit 1
    fi
}

# 主函数
main() {
    check_privileges
    check_dependencies
    download_go
    install_go
    setup_env
    setup_proxy
    verify_installation
    print_info "Golang安装和配置完成！请运行 'source ~/.bashrc' 或重新登录以应用环境变量。"
}

# 执行主函数
main
