# This is for creating a local developer environment to run non-rust commands.
# 
# # Prerequisites
# This assumes you have the following installed:
# - python2.7
# - virtuanenv (with any python version) 
#
# Python recommended command: `sudo pip install virtualenv`
#
# # Usage
# To use simply execute the following. All your paths will be setup for you:
# ```
# source env
# ```
export RUSTFMT_VERSION="0.1.3"
export RUSTCLIPPY_VERSION="0.0.140"
if [ -z $RUST_VERSION ]; then
    export RUST_VERSION="nightly-2017-06-17"
fi

export NPM_PACKAGES="\
elm@0.18.0 \
webpack@2.6.1 \
elm-format@0.6.1-alpha \
phantomjs@2.1.7 \
"

export PYTHON_CHECK="\
web-ui/sel_tests \
web-ui/py_helpers \
scripts/interact.py \
"

export NODE_VERSION="v8.1.2"

if [ -z $TRAVIS_BUILD_DIR ]; then
    # if non-travis, create in target directory and override PATH
    export ENV_DIR=$PWD/target/env
    export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin"
else
    # if on travis, create in ~/build_environment and leave PATH alone
    export ENV_DIR=$HOME/build_environment
fi

if [[ `uname` == "Darwin" ]]; then
    NODE_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-darwin-x64.tar.gz"
else
    NODE_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"
fi

errcho() {
  >&2 echo "\e[1m\e[32m${1}\e[0m"
}

if [ ! -d ".git" ] || [ ! -d "web-ui" ]; then
    errcho "Must be run in repository root."
    exit 1
fi

pathinsert() {
    export PATH="$1:$PATH"
}

mkdir -p $ENV_DIR

################################################################################
# setup rust
errcho "-- setting up rust --"
RUST_DIR=$ENV_DIR/rust
export CARGO_HOME=$RUST_DIR/cargo
export RUSTUP_HOME=$RUST_DIR/multirust
export RUST_BIN=$CARGO_HOME/bin
mkdir -p $CARGO_HOME

if [ ! -d $RUSTUP_HOME ]; then
    errcho "- installing rustup"
    curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUST_VERSION || return $?
fi
pathinsert $RUST_BIN

# always make sure the default is up-to-date
rustup default $RUST_VERSION || return $?
export CARGO_INCREMENTAL=1

################################################################################
# setup python virtualenv and packages
errcho "-- setting up python --"
PY_DIR=$ENV_DIR/art
PY_ACTIVATE=$PY_DIR/bin/activate
export PYTHONPATH="web-ui"
if [ ! -d $PY_DIR ]; then
    virtualenv $PY_DIR -p python2.7 || return $?
    source $PY_ACTIVATE || return $?
else
    source $PY_ACTIVATE || return $?
fi


################################################################################
# set up node path and packages
errcho "-- setting up node.js and elm --"

export NODE_DIR=$ENV_DIR/node
NODE_BIN=$NODE_DIR/bin

if [ -x $NODE_BIN/node ]; then
    current_node_version=$($NODE_BIN/node --version) || return $?
fi
if [ ! -x $NODE_BIN/node ] || [ "$current_node_version" != "$NODE_VERSION" ]; then
    errcho "- installing node.js + npm"
    rm -rf $NODE_DIR && mkdir $NODE_DIR || return $?
    curl -LSfs $NODE_URL | \
        tar xJ --directory $NODE_DIR --strip-components=1 --
fi
pathinsert $NODE_DIR/node_modules/.bin
pathinsert $NODE_BIN

################################################################################
# Do final updates
errcho "-- do final update of dependencies --"
if [ ! -e $RUST_BIN/just ]; then
    errcho "- installing build tools"
    # install required packages. They can be updated with `just update`
    cargo install cargo-update || return $?
    cargo install just || return $?
    just update || return $?
fi

pathinsert $NODE_DIR/node_modules/.bin

if [ ! -e $RUST_BIN/art ]; then
    errcho "- building release+debug artifact as art+artd"
    # build artifact in release mode and debug mode and link both
    cargo build --release --features server || return $?
    cargo build --features server || return $?
    ln -s $PWD/target/release/art $RUST_BIN/art || return $?
    ln -s $PWD/target/debug/art $RUST_BIN/artd || return $?
fi
errcho "-- artifact environment has been set up successfully --"
