#!/bin/sh

# safety subshell to avoid executing anything in case this script is not downloaded properly
(

: "${GHCUP_INSTALL_BASE_PREFIX:=$HOME}"

die() {
    (>&2 printf "\\033[0;31m%s\\033[0m\\n" "$1")
    exit 2
}

edo()
{
    "$@" || die "\"$*\" failed!"
}

eghcup() {
    if [ -z "${BOOTSTRAP_HASKELL_VERBOSE}" ] ; then
        edo ghcup "$@"
    else
        edo ghcup --verbose "$@"
    fi
}

download_ghcup() {
	_plat="$(uname -s)"
	_arch=$(uname -m)

    case "${_plat}" in
        "linux"|"Linux")
			case "${_arch}" in
				x86_64|amd64)
					_url=https://downloads.haskell.org/~ghcup/x86_64-linux-ghcup
					;;
				i*86)
					_url=https://downloads.haskell.org/~ghcup/i386-linux-ghcup
					;;
				*) die "Unknown architecture: ${_arch}"
					;;
			esac
			;;
        "FreeBSD"|"freebsd")
			case "${_arch}" in
				x86_64|amd64)
					;;
				i*86)
					die "i386 currently not supported!"
					;;
				*) die "Unknown architecture: ${_arch}"
					;;
			esac
			_url=https://downloads.haskell.org/~ghcup/x86_64-portbld-freebsd-ghcup
            ;;
        "Darwin"|"darwin")
			case "${_arch}" in
				x86_64|amd64)
					;;
				i*86)
					die "i386 currently not supported!"
					;;
				*) die "Unknown architecture: ${_arch}"
					;;
			esac
			_url=https://downloads.haskell.org/~ghcup/x86_64-apple-darwin-ghcup ;;
        *) die "Unknown platform: ${_plat}"
			;;
    esac

	edo curl -Lf "${_url}" > "${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup/bin/ghcup

	unset _plat _arch _url
}


echo
echo "Welcome to Haskell!"
echo
echo "This will download and install the Glasgow Haskell Compiler (GHC)"
echo "and the Cabal build tool."
echo
echo "ghcup installs only into the following directory, which can be removed anytime:"
echo "  $GHCUP_INSTALL_BASE_PREFIX/.ghcup"
echo

if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
    printf "\\033[0;35m%s\\033[0m\\n" "Press ENTER to proceed"
    printf "\\033[0;35m%s\\033[0m\\n" "or ctrl-c to abort."
    printf "\\033[0;35m%s\\033[0m\\n" "Note that this script can be re-run at any given time."
    echo
    # Wait for user input to continue.
    # shellcheck disable=SC2034
    read -r answer </dev/tty
fi

edo mkdir -p "${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup/bin

if command -V "ghcup" >/dev/null 2>&1 ; then
    if [ -z "${BOOTSTRAP_HASKELL_NO_UPGRADE}" ] ; then
        eghcup upgrade
    fi
else
	download_ghcup
    edo chmod +x "${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup/bin/ghcup

	cat <<-EOF > "${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup/env || die "Failed to create env file"
		export PATH="\$HOME/.cabal/bin:\${GHCUP_INSTALL_BASE_PREFIX:=\$HOME}/.ghcup/bin:\$PATH"
		EOF
	# shellcheck disable=SC1090
    edo . "${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup/env
fi

echo
echo "$(ghcup tool-requirements)"
echo

if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
    printf "\\033[0;35m%s\\033[0m\\n" "Press ENTER to proceed"
    printf "\\033[0;35m%s\\033[0m\\n" "or ctrl-c to abort."
    printf "\\033[0;35m%s\\033[0m\\n" "Installation may take a while."
    echo

    # Wait for user input to continue.
    # shellcheck disable=SC2034
    read -r answer </dev/tty
fi

eghcup --cache install

eghcup set
eghcup --cache install-cabal

edo cabal new-update

printf "\\033[0;35m%s\\033[0m\\n" ""
printf "\\033[0;35m%s\\033[0m\\n" "Installation done!"
printf "\\033[0;35m%s\\033[0m\\n" ""

if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
    echo "In order to run ghc and cabal, you need to adjust your PATH variable."
    echo "You may want to source '$GHCUP_INSTALL_BASE_PREFIX/.ghcup/env' in your shell"
    echo "configuration to do so (e.g. ~/.bashrc)."

	case $SHELL in
		*/zsh) # login shell is zsh
			GHCUP_PROFILE_FILE="$HOME/.zshrc"
			MY_SHELL="zsh" ;;
		*/bash) # login shell is bash
			if [ -f "$HOME/.bashrc" ] ; then # bashrc is not sourced by default, so assume it isn't if file does not exist
				GHCUP_PROFILE_FILE="$HOME/.bashrc"
			else
				GHCUP_PROFILE_FILE="$HOME/.bash_profile"
			fi

			MY_SHELL="bash" ;;
		*/sh) # login shell is sh, but might be a symlink to bash or zsh
			if [ -n "${BASH}" ] ; then
				if [ -f "$HOME/.bashrc" ] ; then # bashrc is not sourced by default, so assume it isn't if file does not exist
					GHCUP_PROFILE_FILE="$HOME/.bashrc"
				else
					GHCUP_PROFILE_FILE="$HOME/.bash_profile"
				fi

				MY_SHELL="bash"
			elif [ -n "${ZSH_VERSION}" ] ; then
				GHCUP_PROFILE_FILE="$HOME/.zshrc"
				MY_SHELL="zsh"
			else
				exit 0
			fi
			;;
		*) exit 0 ;;
	esac


	printf "\\033[0;35m%s\\033[0m\\n" ""
	printf "\\033[0;35m%s\\033[0m\\n" "Detected ${MY_SHELL} shell on your system..."
	printf "\\033[0;35m%s\\033[0m\\n" "If you want ghcup to automatically add the required PATH variable to \"${GHCUP_PROFILE_FILE}\""
	printf "\\033[0;35m%s\\033[0m\\n" "answer with YES, otherwise with NO and press ENTER."
	printf "\\033[0;35m%s\\033[0m\\n" ""

    while true; do
        read -r next_answer </dev/tty

        case $next_answer in
            [Yy]*)
                echo "[ -f \"\${GHCUP_INSTALL_BASE_PREFIX:=\$HOME}/.ghcup/env\" ] && source \"\${GHCUP_INSTALL_BASE_PREFIX:=\$HOME}/.ghcup/env\"" >> "${GHCUP_PROFILE_FILE}"
                printf "\\033[0;35m%s\\033[0m\\n" "OK! ${GHCUP_PROFILE_FILE} has been modified. Restart your terminal for the changes to take effect,"
                printf "\\033[0;35m%s\\033[0m\\n" "or type \"source ${GHCUP_INSTALL_BASE_PREFIX}/.ghcup/env\" to apply them in your current terminal session."
                exit 0;;
            [Nn]*)
                exit 0;;
            *)
                echo "Please type YES or NO and press enter.";;
        esac
    done
fi
)

# vim: tabstop=4 shiftwidth=4 expandtab