#!/usr/bin/env bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

eval EXEC_INSTALL=true
eval EXEC_UPDATE=false
eval EXEC_CLEAN=false
eval EXEC_DEVELOP=false
eval EXEC_VERSION=false
eval EXEC_DIST=false
eval EXEC_GIT_NPM_INSTALL_JSAPI=false
eval EXEC_VERSION_JSAPI=false
eval EXEC_START=true
eval EXEC_TEST=false
eval EXEC_E2E=false
eval JSAPI_VERSION=""
eval NG2_COMPONENTS_VERSION=""
eval GIT_ISH=""

eval projects=( "@alfresco/core"
    "@alfresco/content-service"
    "@alfresco/process-service"
    "@alfresco/extensions" )

show_help() {
    echo "Usage: start.sh"
    echo ""
    echo "-ss or --skipstart build only the demo shell without start"
    echo "-si or --skipinstall start the demo shell and  skip the install the dependencies"
    echo "-dev or --develop start the demo shell using the relative lib folder to link the components"
    echo "-dist build or start the demo shell in dist mode"
    echo "-t or --test execute test"
    echo "--e2e execute e2e test"
    echo "-u or --update start the demo shell and update the dependencies"
    echo "-c or --clean  clean the demo shell and reinstall the dependencies"
    echo "-r or --registry to download the packages from an alternative npm registry example -registry 'http://npm.local.me:8080/' "
    echo "-v or --version install different version of ng2_components from npm defined in the package.json this option is not compatible with -d"
    echo "-gitjsapi to build all the components against a commit-ish version of the JS-API"
    echo "-vjsapi install different version from npm of JS-API defined in the package.json"
}

install() {
    EXEC_INSTALL=false
}

update() {
    EXEC_UPDATE=true
}

develop() {
    EXEC_DEVELOP=true
}

enable_dist() {
    EXEC_DIST=true
}

disable_start() {
    EXEC_START=false
}

enable_test() {
    EXEC_TEST=true
}

enable_e2e() {
    EXEC_E2E=true
}

enable_js_api_git_link() {
    GIT_ISH='git+https://github.com/Alfresco/alfresco-js-api.git#'$1
    EXEC_GIT_NPM_INSTALL_JSAPI=true
}

version_component() {
    NG2_COMPONENTS_VERSION=$1

    if [[ "${NG2_COMPONENTS_VERSION}" == "" ]]
    then
      echo "NG2 components version required with -v | -version"
      exit 0
    fi

    EXEC_VERSION=true
}

version_js_api() {
    JSAPI_VERSION=$1

    if [[ "${JSAPI_VERSION}" == "" ]]
    then
      echo "JSAPI version required with -vJSApi"
      exit 0
    fi

    EXEC_VERSION_JSAPI=true
}

change_registry(){
    NPM_REGISTRY=$1

    if [[ "${NPM_REGISTRY}" == "" ]]
    then
      echo "NPM registry required WITH OPTION -r | -registry"
      exit 0
    fi

    echo "====== CHANGE REGISTRY: ${NPM_REGISTRY} ====="
    npm config set registry ${NPM_REGISTRY}
}

clean() {
    EXEC_CLEAN=true
    EXEC_INSTALL=true
}

while [[ $1  == -* ]]; do
    case "$1" in
      -h|--help|-\?) show_help; exit 0;;
      -u|--update) update; shift;;
      -c|--clean) clean; shift;;
      -t|--test) enable_test; shift;;
      --e2e) enable_e2e; shift;;
      -r|--registry)  change_registry $2; shift 2;;
      -v|--version)  version_component $2; shift 2;;
      -si|--skipinstall) install; shift;;
      -ss|--skipstart)  disable_start; shift;;
      -dev|--develop) develop; shift;;
      -dist)  enable_dist; shift;;
      -gitjsapi)  enable_js_api_git_link $2; shift 2;;
      -vjsapi)  version_js_api $2; shift 2;;
      -*) echo "invalid option: $1" 1>&2; show_help; exit 0;;
    esac
done

cd "$DIR/.."

if $EXEC_CLEAN == true; then
  echo "====== Clean Demo shell ====="
  npm install rimraf
  npm run clean
fi

if $EXEC_INSTALL == true; then
  echo "====== Install Demo shell ====="
  npm install
fi

if $EXEC_VERSION == true; then
   echo "====== Install version "${NG2_COMPONENTS_VERSION}" of components ====="

    if [[ "${EXEC_DEVELOP}" == "" ]]
    then
      echo "Option -v is not compatible with -d see the help"
      exit 0
    fi

    for PACKAGE in ${projects[@]}
    do
      npm install ${PACKAGE}@${NG2_COMPONENTS_VERSION}
    done
fi

if $EXEC_GIT_NPM_INSTALL_JSAPI == true; then
  echo "====== Use the alfresco JS-API  '$GIT_ISH'====="
  npm install $GIT_ISH --no-save
  cd "$DIR/../demo-shell/node_modules/alfresco-js-api"
  npm install
fi

if $EXEC_VERSION_JSAPI == true; then
  echo "====== Use the alfresco JS-API '$JSAPI_VERSION'====="
  npm install alfresco-js-api@${JSAPI_VERSION}
fi

if $EXEC_TEST == true; then
  echo "====== Demo shell Test ====="
  npm run test || exit 1
  exit 0
fi

if $EXEC_E2E == true; then
  echo "====== Demo shell e2e ====="
  npm run e2e
  exit 0
fi

if $EXEC_START == true; then
    if $EXEC_DEVELOP == true; then
        echo "====== Start Demo shell dev mode ====="
        npm run start:dev
    elif $EXEC_DIST == true; then
        echo "====== Start Demo shell dist mode ====="
        npm run start:dist
    else
        echo "====== Start Demo shell ====="
        npm run start
    fi
else
    if $EXEC_DEVELOP == true; then
        echo "====== Build Demo shell dev mode ====="
        npm run build:dev
    else
        echo "====== Build Demo shell ====="
        npm run build
    fi
fi