#!/bin/bash

_init() {
    # Save release LDFLAGS
    LDFLAGS=$(go run buildscripts/gen-ldflags.go)

    # Extract release tag
    release_tag=$(echo $LDFLAGS | awk {'print $4'} | cut -f2 -d=)

    # Verify release tag.
    if [ -z "$release_tag" ]; then
        echo "Release tag cannot be empty. Please check return value of \`go run buildscripts/gen-ldflags.go\`"
        exit 1;
    fi

    # Extract release string.
    release_str=$(echo $MINIO_RELEASE | tr '[:upper:]' '[:lower:]')

    # Verify release string.
    if [ -z "$release_str" ]; then
        echo "Release string cannot be empty. Please set \`MINIO_RELEASE\` env variable."
        exit 1;
    fi

    # List of supported architectures
    SUPPORTED_OSARCH='linux/386 linux/amd64 linux/arm linux/arm64 windows/386 windows/amd64 darwin/amd64 freebsd/amd64'

    ## System binaries
    CP=`which cp`
    SHASUM=`which shasum`
    SED=`which sed`
}

go_build() {
    local osarch=$1
    os=$(echo $osarch | cut -f1 -d'/')
    arch=$(echo $osarch | cut -f2 -d'/')
    package=$(go list -f '{{.ImportPath}}')
    echo -n "-->"
    printf "%15s:%s\n" "${osarch}" "${package}"

    # Release binary name
    release_bin="$release_str/$os-$arch/$(basename $package).$release_tag"
    # Release binary downloadable name
    release_real_bin="$release_str/$os-$arch/$(basename $package)"
    # Release shasum name
    release_shasum="$release_str/$os-$arch/$(basename $package).shasum"

    # Go build to build the binary.
    if [ "${arch}" == "arm" ]; then
        # Release binary downloadable name
        release_real_bin_6="$release_str/$os-${arch}6vl/$(basename $package)"

        release_bin_6="$release_str/$os-${arch}6vl/$(basename $package).$release_tag"
        ## Support building for ARM6vl
        GOARM=6 GOOS=$os GOARCH=$arch go build --ldflags "${LDFLAGS}" -o $release_bin_6

        ## Copy
        $CP -p $release_bin_6 $release_real_bin_6

        # Release shasum name
        release_shasum_6="$release_str/$os-${arch}6vl/$(basename $package).shasum"

        # Calculate shasum
        shasum_str=$(${SHASUM} ${release_bin_6})
        echo ${shasum_str} | $SED "s/$release_str\/$os-${arch}6vl\///g" > $release_shasum_6

        # Release binary downloadable name
        release_real_bin_7="$release_str/$os-$arch/$(basename $package)"

        release_bin_7="$release_str/$os-$arch/$(basename $package).$release_tag"
        ## Support building for ARM7vl
        GOARM=7 GOOS=$os GOARCH=$arch go build --ldflags "${LDFLAGS}" -o $release_bin_7

        ## Copy
        $CP -p $release_bin_7 $release_real_bin_7

        # Release shasum name
        release_shasum_7="$release_str/$os-$arch/$(basename $package).shasum"

        # Calculate shasum
        shasum_str=$(${SHASUM} ${release_bin_7})
        echo ${shasum_str} | $SED "s/$release_str\/$os-$arch\///g" > $release_shasum_7
    else
        GOOS=$os GOARCH=$arch go build --ldflags "${LDFLAGS}" -o $release_bin

        # Create copy
        if [ $os == "windows" ]; then
            $CP -p $release_bin ${release_real_bin}.exe
        else
            $CP -p $release_bin $release_real_bin
        fi

        # Calculate shasum
        shasum_str=$(${SHASUM} ${release_bin})
        echo ${shasum_str} | $SED "s/$release_str\/$os-$arch\///g" > $release_shasum
    fi
}

main() {
    # Build releases.
    echo "Executing $release_str builds for OS: ${SUPPORTED_OSARCH}"
    echo  "Choose an OS Arch from the below"
    for osarch in ${SUPPORTED_OSARCH}; do
        echo ${osarch}
    done

    read -p "If you want to build for all, Just press Enter: " chosen_osarch
    if [ "$chosen_osarch" = "" ] || [ "$chosen_osarch" = "all" ]; then
        for each_osarch in ${SUPPORTED_OSARCH}; do
            go_build ${each_osarch}
        done
    else
        for each_osarch in $(echo $chosen_osarch | sed 's/,/ /g'); do
            go_build ${each_osarch}
        done
    fi

}

# Run main.
_init && main