#!/usr/bin/env bash
##makedesc: Install golang

# https://go.dev/dl/
# https://golang.org/doc/install
# https://github.com/udhos/update-golang/blob/master/update-golang.sh

set -eo pipefail

installed() { command -v "$1" >/dev/null 2>&1; }

doRemove() {
    [ -d "/usr/local/go" ] && sudo rm -rf "/usr/local/go"
}

install() {
    dlUrl="https://go.dev/dl"
    json=$(curl -sSL "$dlUrl/?mode=json")
    version=$(echo "$json" | jq -r '.[0].version')
    echo
    echo "==============================================="
    echo "Installing golang v$version"
    echo "==============================================="
    echo

    local os="linux"
    [ "$(uname -s)" = "Darwin" ] && os="darwin"

    latestJson=$(echo "$json" | jq -r ".[0].files.[] | select (.kind == \"archive\" and .os == \"$os\" and .arch == \"amd64\")")
    fileName=$(echo "$latestJson" | jq -r '.filename')
    fileUrl="$dlUrl/$fileName"
    downloadPath="$HOME/install"
    archivePath="$downloadPath/$fileName"
    doRemove
    if [ ! -f "$archivePath" ]; then
        if installed wget; then
            wget -q --show-progress "$fileUrl" -O "$archivePath"
        else
            curl -fsSL "$fileUrl" -o "$archivePath"
        fi
    fi
    sudo tar -xzf "$archivePath" -C /usr/local
    sudo chown "$USER": -R /usr/local/go
    if ! grep -q '/usr/local/go/bin' "$HOME/.profile" 2>/dev/null; then
        echo 'export PATH="/usr/local/go/bin:$PATH"' >> "$HOME/.profile"
        echo "export GOPATH=\"\$HOME/.go\"" >> "$HOME/.profile"
    fi

    # shellcheck source=/dev/null
    source "$HOME/.profile"

    echo
    go version
    go install github.com/go-delve/delve/cmd/dlv@latest
    echo "Finish!"
    echo
}

upgrade() {
    install
}

remove() {
    echo
    echo "==============================================="
    echo "Removing golang"
    echo "==============================================="
    echo
    doRemove
    sed -i '/\/usr\/local\/go\/bin/d' "$HOME/.profile"
    sed -i '/GOPATH/d' "$HOME/.profile"
    echo
    echo "Finish!"
    echo
}

case "$1" in
    u|upgrade|update) upgrade ;;
    r|remove|d|delete|p|purge) remove ;;
    *) install ;;
esac

