#!/usr/bin/env bash

download_release_tarball() {
    __resultvar=$1
    __submodule_path=$2
    __repo_name=$(echo $2 | cut -d '/' -f 2)
    __arch=$(uname)
    __release_name="${__repo_name}-${__arch}"
    __release_sha1=$(git rev-parse @:"${__submodule_path}")
    __release_tag="${__release_sha1:0:16}"
    __release_tag_url="https://api.github.com/repos/filecoin-project/${__repo_name}/releases/tags/${__release_tag}"

    if [[ ! $__arch =~ ^(Darwin|Linux)$ ]]; then
      (>&2 echo "precompiled releases exist for only OSX and Linux")
      return 1
    fi

    echo "acquiring release @ ${__release_tag}"

    __release_response=$(curl \
        --retry 3 \
        --location $__release_tag_url)

    __release_url=$(echo $__release_response | jq -r ".assets[] | select(.name | contains(\"${__release_name}\")) | .url")

    if [[ -z "$__release_url" ]]; then
        (>&2 echo "failed to download release (tag URL: ${__release_tag_url}, response: ${__release_response})")
        return 1
    fi

    __tar_path="/tmp/${__release_name}_$(basename ${__release_url}).tar.gz"

    if [[ ! -f "${__tar_path}" ]]; then
        __asset_url=$(curl \
            --head \
            --retry 3 \
            --header "Accept:application/octet-stream" \
            --location \
            --output /dev/null \
            -w %{url_effective} \
            "$__release_url")

        curl --retry 3 --output "${__tar_path}" "$__asset_url"
        if [[ $? -ne "0" ]]; then
            (>&2 echo "failed to download release asset (tag URL: ${__release_tag_url}, asset URL: ${__asset_url})")
            return 1
        fi
    fi

    eval $__resultvar="'$__tar_path'"
}

build_from_source() {
    __submodule_path=$1
    __submodule_sha1=$(git rev-parse @:"${__submodule_path}")
    __submodule_sha1_truncated="${__submodule_sha1:0:16}"

    echo "building from source @ ${__submodule_sha1_truncated}"

    if ! [ -x "$(command -v cargo)" ]; then
        (>&2 echo 'Error: cargo is not installed.')
        (>&2 echo 'Install Rust toolchain to resolve this problem.')
        exit 1
    fi

    if ! [ -x "$(command -v rustup)" ]; then
        (>&2 echo 'Error: rustup is not installed.')
        (>&2 echo 'Install Rust toolchain installer to resolve this problem.')
        exit 1
    fi

    pushd $__submodule_path

    cargo --version
    cargo update

    if [[ -f "./scripts/build-release.sh" ]]; then
        ./scripts/build-release.sh $(cat rust-toolchain)
    else
        cargo build --release --all
    fi

    popd
}
