#!/bin/bash

set -euo pipefail

################################################################################
# STEP-00: environment variables related to CDK
################################################################################
cat << 'EOF' | sudo tee /etc/profile.d/cdk.sh

# NVM installation after this env. var. is effective should survive reboots.
export NVM_DIR=$HOME/SageMaker/.initsmnb.d/.nvm
[[ -s "$NVM_DIR/nvm.sh" ]] && . "$NVM_DIR/nvm.sh"  # Loads nvm
[[ -s "$NVM_DIR/bash_completion" ]] && . "$NVM_DIR/bash_completion"  # Loads nvm bash_completion
EOF


################################################################################
# STEP-01: helper functions to install cdk (only when not installed yet).
################################################################################
# Activate for the current shell.
export NVM_DIR=$HOME/SageMaker/.initsmnb.d/.nvm
[[ -s "$NVM_DIR/nvm.sh" ]] && . "$NVM_DIR/nvm.sh"  # Loads nvm
[[ -s "$NVM_DIR/bash_completion" ]] && . "$NVM_DIR/bash_completion"  # Loads nvm bash_completion

detect_cmd() {
    "$@" &> /dev/null
    [[ $? == 0 ]] && echo "detected" || echo "not_detected"
}

mkdir -p $NVM_DIR

# Install nvm to NVM_DIR
if [[ $(detect_cmd nvm) == "not_detected" ]]; then
    echo "Installing nvm..."
    NVM_VERSION=$(curl -sL https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r '.name')
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh | bash
    [[ -s "$NVM_DIR/nvm.sh" ]] && . "$NVM_DIR/nvm.sh"  # Loads nvm
    [[ -s "$NVM_DIR/bash_completion" ]] && . "$NVM_DIR/bash_completion"  # Loads nvm bash_completion
fi
echo "Checking nvm:" `nvm --version`

# Install node.js (use lts version as-per CDK recommendation)
if [[ \
    ( $(detect_cmd node -e "console.log('Running Node.js ' + process.version)") == "not_detected" ) \
    || ( "$(which node)" == /home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/node ) \
]]; then
    echo "Installing node.js and npm..."
    GLIBC_VERSION=$(rpm -q --queryformat '%{version}' glibc)
    if [[ "$GLIBC_VERSION" > "2.26" ]]; then
        nvm install --lts
        nvm use --lts
    else
        echo "Old glibc-$GLIBC_VERSION detected. Falling back to node.js v16."
        nvm install 16
        nvm use 16
    fi
    npm install -g npm
fi

node -e "console.log('Running Node.js ' + process.version)"
echo "Checking npm:" `npm -v`

# Install CDK
if [[ $(detect_cmd cdk --version) == "not_detected" ]]; then
    echo "Installing cdk..."
    npm install -g aws-cdk
fi

# Run once, and see if there's any warning re. incompatible node.js version
echo "CDK version:" $(cdk --version)