#!/usr/bin/env bash

# helper functions
yell() { echo -e "${RED}FAILED> $* ${NC}" >&2; }
die() { yell "$*"; exit 1; }
try() { "$@" || die "failed executing: $*"; }
log() { echo -e "--> $*"; }
maybe_sudo() { $([ $NEED_SUDO ] && echo sudo) "$@"; }

# console colors
RED='\033[0;31m'
GREEN='\033[0;32m'
PURPLE='\033[0;35m'
BLUE='\033[0;34m'
YELLOW='\033[0;33m'
NC='\033[0m'

# basic variables
INSTALL_PATH=${INSTALL_PATH:-"/usr/local/bin"}
NEED_SUDO=${NEED_SUDO:-1}
REPO="nhost/nhost"

# check for existing installation
hasCli=$(which nhost)
if [ "$?" = "0" ]; then
    log ""
    log "${GREEN}You already have the Nhost CLI at '${hasCli}'${NC}"
    export n=3
    log "${YELLOW}Downloading again in $n seconds... Press Ctrl+C to cancel.${NC}"
    log ""
    sleep $n
fi

# check for curl
hasCurl=$(which curl)
if [ "$?" = "1" ]; then
    die "You need to install curl to use this script."
fi

# get release version
version=${1:-latest}
log "Getting $version version..."
if [[ "$version" == "latest" ]]; then
    release=$(curl --silent https://api.github.com/repos/nhost/nhost/releases\?per_page=100 | grep tag_name | grep \"cli\@ | head -n 1 | sed 's/.*"tag_name": "\([^"]*\)".*/\1/')
    version=$( echo $release | sed 's/.*@//')
else
    release="cli@$release"
fi

# check version exists
if [ ! $version ]; then
    log "${YELLOW}"
    log "Failed while attempting to install Nhost CLI. Please manually install:"
    log ""
    log "1. Open your web browser and go to https://github.com/$REPO/releases/latest"
    log "2. Download the CLI from latest release for your platform. Name it 'nhost'."
    log "3. chmod +x ./cli"
    log "4. mv ./cli /usr/local/bin/nhost"
    log "${NC}"
    die "exiting..."
fi

# show latest version
if [[ "$release" == "latest" ]]; then
    log "Latest version is $version"
fi

# get platform
platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
    platform='linux'
elif [[ "$unamestr" == 'Darwin' ]]; then
    platform='darwin'
elif [[ "$unamestr" == 'Windows' ]]; then
    platform='windows'
fi

# die for unknown platform
if [[ "$platform" == 'unknown' ]]; then
    die "Unknown OS platform"
fi

# set arch
arch='unknown'
archstr=`uname -m`
if [[ "$archstr" == 'x86_64' ]]; then
    arch='amd64'
elif [[ "$archstr" == 'arm64' || "$archstr" == 'aarch64' ]]; then
    arch='arm64'
else
    arch='386'
fi

# some variables
suffix="-${platform}-${arch}"

if [[ "$platform" != 'windows' ]]; then
    extension=".tar.gz"
else
    extension='.zip'
fi

# variables for install
targetFile="cli-$version$suffix$extension"

encodedRelease=$(echo $release | sed 's/@/%40/g')
url="https://github.com/${REPO}/releases/download/${encodedRelease}/${targetFile}"

# remove previous download
if [ -e $targetFile ]; then
    rm $targetFile
fi

# tell what we are downloading
log "${PURPLE}Downloading Nhost ${version} for ${platform}-${arch} to ${targetFile}${NC}"

# download and extract files
try curl -L -f -o $targetFile "$url"
try chmod +x $targetFile

if [[ "$platform" != 'windows' ]]; then
    try tar -xvf $targetFile
else
    try unzip $targetFile
fi

try rm ./$targetFile

# install and test
log "${GREEN}Download complete!${NC}"
echo

if [[ "$platform" != 'windows' ]]; then
    try sudo mv ./cli ${INSTALL_PATH}/nhost
    nhost --version
    echo
    log "${BLUE}Use Nhost CLI with: nhost --help${NC}"
else
    try mv cli.exe nhost.exe
    log "${BLUE}Please copy nhost.exe in a directory covered by your Windows path"
fi
