#/bin/bash

set -e

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/env_config"

echo 'Validate REF_NAME for allowed characters and reserved words'
source "$SCRIPT_DIR/validate_ref_name"
validate_ref_name

ssh -p "$SERVER_PORT" "$SERVER" <<-EOF
  set -e

  echo 'Create directories and files'
  mkdir -p $NEW_RELEASE_TEMP_PATH
  touch $ENV_PATH

  echo 'Clone repository'
  if ! (git clone -b $GIT_BRANCH $REPOSITORY_URL $NEW_RELEASE_TEMP_PATH) ; then
    echo 'Failed to clone the repository'
    exit 1
  fi

  echo 'Set environment variables'
  cd $NEW_RELEASE_APP_TEMP_PATH
  cp "$ENV_PATH" .env
  echo "PORT=$APP_PORT" >> .env
  echo "FRONTEND_HOST=$FRONTEND_HOST" >> .env

  echo 'Create symlinks'
  cd $NEW_RELEASE_APP_TEMP_PATH
  rm -rf public/uploads/
  ln -s $UPLOADS_PATH public/uploads

  echo 'Load nvm and set node version'
  source ~/.bashrc
  source ~/.nvm/nvm.sh
  nvm use

  echo 'Install packages'
  if ! (yarn install --frozen-lockfile) ; then
    echo 'An unknown error has occurred during the installation process'
    exit 1
  fi

  echo 'Run build'
  if ! (yarn build) ; then
    echo 'An unknown error has occurred during the build process'
    exit 1
  fi

  echo 'Activate current release'
  mv $NEW_RELEASE_APP_TEMP_PATH $NEW_RELEASE_PUBLISHED_PATH
  if [ -L $CURRENT_RELEASE ] ; then
    unlink $CURRENT_RELEASE
  fi
  ln -s $NEW_RELEASE_PUBLISHED_PATH $CURRENT_RELEASE

  cd $CURRENT_RELEASE

  echo 'Start the pm2 process'
  pm2 delete $PM2_PROCESS_NAME &> /dev/null || true
  pm2 start npm --name $PM2_PROCESS_NAME -- start
  pm2 save

  echo 'Remove temporary releases'
  rm -rf $RELEASES_PATH/*.temp

  echo 'Remove old releases'
  cd $RELEASES_PATH
  ls -t | tail -n +$((RELEASES_TO_KEEP + 1)) | xargs rm -rf

  echo 'Create an nginx configuration file and reload nginx'
  echo "upstream ${APP_NAME}_${REF_NAME} { server 127.0.0.1:$APP_PORT; }" > $NGINX_CONF_PATH
  sudo service nginx reload
EOF
