#!/bin/bash

# Default architecture
DEFAULT_ARCH="linux/amd64"

# Supported architectures (adjust as needed)
ARCHITECTURES=("linux/amd64" "linux/arm64" "linux/arm/v7" "darwin/amd64" "darwin/arm64")

# Ensure all necessary directories exist and go modules are ready
prepare_build() {
    # Create necessary directories if they don't exist
    mkdir -p dist
    mkdir -p build_logs

    # Initialize go modules if go.mod does not exist
    if [ ! -f go.mod ]; then
        echo "Initializing Go modules"
        go mod init yourmodule  # Replace 'yourmodule' with your actual module name or path
    fi

    # Fetch and ensure all dependencies are up to date
    echo "Checking dependencies..."
    go mod tidy
}

# Build function
build_binary() {
    os=$1
    arch=$2
    output_name="ssh-timeout"

    if [[ "$os/$arch" != "$DEFAULT_ARCH" ]]; then
        output_name="${output_name}_${os}_${arch}"
    fi

    output_name="dist/${output_name}"

    # Dynamic Linking
    echo "Building dynamically linked for ${os}/${arch} -> ${output_name}"
    GOOS=${os} GOARCH=${arch} go build -o ${output_name} main.go 2>build_logs/${os}_${arch}_build.log
    if [ $? -eq 0 ]; then
        echo "Successfully built ${output_name}"
    else
        echo "Failed to build ${output_name}. Check build_logs/${os}_${arch}_build.log for errors."
    fi

    # Static Linking
    if [[ "$os" == "linux" ]]; then # Typically, static linking is most relevant for Linux environments
        static_output_name="${output_name}_static"
        echo "Building statically linked for ${os}/${arch} -> ${static_output_name}"
        CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go build -a -ldflags '-extldflags "-static"' -o ${static_output_name} main.go 2>build_logs/${os}_${arch}_static_build.log
        if [ $? -eq 0 ]; then
            echo "Successfully built ${static_output_name}"
        else
            echo "Failed to build ${static_output_name}. Check build_logs/${os}_${arch}_static_build.log for errors."
        fi
    fi
}

# Main Build Process
prepare_build
for arch in "${ARCHITECTURES[@]}"; do
    IFS='/' read -r -a parts <<< "$arch"  # Split architecture string
    os=${parts[0]}
    arch=${parts[1]}
    build_binary $os $arch
done

echo "Build process completed."

