#!/bin/sh

set -e

reset="\033[0m"
red="\033[31m"
green="\033[32m"
yellow="\033[33m"
cyan="\033[36m"
white="\033[37m"

trap errorMessage EXIT

function errorMessage {
  exit_code=$?
  if [ $exit_code -eq 0 ]; then
    exit
  fi
  printf "\n${red}Error: Amplify CLI failed to install. Check your internet connection and try again.$reset\n"
  printf "If this error still occurs, install the CLI using NPM: ${cyan}npm i -g @aws-amplify/cli$reset\n"
}

printf "\n$yellow Installing the AWS Amplify CLI...$reset\n\n"

# Detect platform
if [[ $OSTYPE == "linux-gnu" ]]; then
  PLATFORM="linux"
elif [[ $OSTYPE == "darwin"* ]]; then
  PLATFORM="macos"
else
  echo "$red Sorry, there's no Amplify CLI binary installer available for this platform."
  exit 1
fi

# Detect architecture and fallback to Rosetta when using M1 Macbook
MACHINE_TYPE=`uname -m`
if [[ $MACHINE_TYPE == "x86_64" ]]; then
  ARCH='x64'
elif [[ $OSTYPE == "darwin"* && $MACHINE_TYPE == "arm64" ]]; then
  ARCH='x64'
else
  echo "$red Sorry, there's no Amplify CLI binary installer available for $MACHINE_TYPE architecture."
  exit 1
fi

REPO_OWNER=aws-amplify
REPO_NAME=amplify-cli

if [[ -z "$version" ]]; then
  # if no version specified, look up the latest version
  version=`curl -sL https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest | grep 'tag_name' | grep -oE "v[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+\.[0-9]+)?"`
fi

BASE_NAME=amplify-pkg-$PLATFORM
TAR_NAME=${BASE_NAME}.tgz
BINARY_URL=https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/$version/$TAR_NAME

# Dowload binary
BINARIES_DIR_PATH=$HOME/.amplify/bin
BINARY_NAME=amplify
BINARY_PATH=$BINARIES_DIR_PATH/$BINARY_NAME
TAR_PATH=$BINARIES_DIR_PATH/$TAR_NAME
EXTRACTION_PATH=$BINARIES_DIR_PATH/$BASE_NAME
mkdir -p $BINARIES_DIR_PATH

printf "$yellow Downloading binary...\n$reset"
curl -L -o $TAR_PATH $BINARY_URL
printf "$green Download complete!\n$reset"

printf "$yellow Extracting binary...\n$reset"
tar xzf $TAR_PATH -C $BINARIES_DIR_PATH
mv $EXTRACTION_PATH $BINARY_PATH
chmod +x $BINARY_PATH
rm $TAR_PATH
printf "$green Extraction complete!\n$reset"

# Add to $PATH
SOURCE_STR="# Added by Amplify CLI binary installer\nexport PATH=\"\$HOME/.amplify/bin:\$PATH\"\n"
add_to_path () {
  command printf "\n$SOURCE_STR" >> "$1"
  printf "\n$yellow Added the following to $1:\n\n$SOURCE_STR$reset"
}
SHELLTYPE="$(basename "/$SHELL")"
if [[ $SHELLTYPE = "fish" ]]; then
  command fish -c 'set -U fish_user_paths ~/.amplify/bin $fish_user_paths'
  printf "\n$yellow Added ~/.amplify/bin to fish_user_paths universal variable$reset."
elif [[ $SHELLTYPE = "zsh" ]]; then
  SHELL_CONFIG=$HOME/.zshrc
  if [ -r $SHELL_CONFIG ] && (! `grep -q '.amplify/bin' $SHELL_CONFIG`); then
    add_to_path $SHELL_CONFIG
  fi
else
  SHELL_CONFIG=$HOME/.bashrc
  if [ -r $SHELL_CONFIG ] && (! `grep -q '.amplify/bin' $SHELL_CONFIG`); then
    add_to_path $SHELL_CONFIG
  fi
  SHELL_CONFIG=$HOME/.bash_profile
  if [ -r $SHELL_CONFIG ] && (! `grep -q '.amplify/bin' $SHELL_CONFIG`); then
    add_to_path $SHELL_CONFIG
  fi
  SHELL_CONFIG=$HOME/.bash_login
  if [ -r $SHELL_CONFIG ] && (! `grep -q '.amplify/bin' $SHELL_CONFIG`); then
    add_to_path $SHELL_CONFIG
  fi
  SHELL_CONFIG=$HOME/.profile
  if [ -r $SHELL_CONFIG ] && (! `grep -q '.amplify/bin' $SHELL_CONFIG`); then
    add_to_path $SHELL_CONFIG
  fi
fi

$BINARY_PATH plugin scan
printf "$green\nSuccessfully installed the Amplify CLI.\nRun '$BINARY_NAME help' to get started!$reset\n"
