#!/usr/bin/env bash

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

eval JS_API=false
eval GNU=false
eval DIFFERENT_JS_API=false

eval projects=( "cli"
    "core"
    "content-services"
    "process-services"
    "process-services-cloud"
    "insights"
    "testing"
    "extensions"
    "eslint-angular"
    "js-api" )

cd `dirname $0`

show_help() {
    echo "Usage: update-version.sh"
    echo ""
    echo "-vj or -versionjsapi  to use a different version of js-api"
    echo "-v or -version  version to update"
    echo "-gnu for gnu"
}

get_next_version() {
    PKG_VERSION=`node -p "require('$1/package.json')".version;`;

    if [[ $PKG_VERSION =~ [0-9]*\.[0-9]*\.[0-9]*-.* ]]; then
       PKG_VERSION=$PKG_VERSION
    else
        PKG_VERSION=( ${PKG_VERSION//./ } )
        ((PKG_VERSION[1]++))
        PKG_VERSION[2]=0
        PKG_VERSION="${PKG_VERSION[0]}.${PKG_VERSION[1]}.${PKG_VERSION[2]}"
    fi

    if [[ $GH_BUILD_NUMBER != "" ]]; then
        PKG_VERSION=$PKG_VERSION-$GH_BUILD_NUMBER
    fi

    echo $PKG_VERSION
}

VERSION=`get_next_version $DIR/..`
JS_API_VERSION=`get_next_version $DIR/../lib/js-api`

echo "====== New libs version: $VERSION ====="
echo "====== New js-api version: $JS_API_VERSION ====="

gnu_mode() {
    echo "====== GNU MODE ====="
    GNU=true
}

version_change() {
    echo "====== New version $1 ====="
    VERSION=$1
}

version_js_change() {
    echo "====== Alfresco JS-API version $1 ====="
    JS_API_VERSION=$1
    DIFFERENT_JS_API=true
}

update_library_version() {
    DESTDIR="$DIR/../lib/$1"
    cd $DESTDIR

    if [[ $1 == "js-api" ]]; then
        echo "====== $1@$JS_API_VERSION ======"
        npm version --allow-same-version --no-git-tag-version --force --loglevel=error $JS_API_VERSION
    else
        echo "====== $1@$VERSION ======"
        npm version --allow-same-version --no-git-tag-version --force --loglevel=error $VERSION
    fi
}

update_dependency_version() {
    sed "${sedi[@]}" "s/\"$1\": \".*\"/\"$1\": \">=$2\"/g" "package.json"
    sed "${sedi[@]}" "s/\"$1\": \"~.*\"/\"$1\": \"~$2\"/g" "package.json"
    sed "${sedi[@]}" "s/\"$1\": \"^.*\"/\"$1\": \"^$2\"/g" "package.json"
}

update_dependencies() {
    for PROJECT in ${projects[@]}
    do
        if [[ $PROJECT == "js-api" ]]; then
            PROJECT="@alfresco\/$PROJECT"
            echo "├─ $PROJECT@$JS_API_VERSION"
            update_dependency_version $PROJECT $JS_API_VERSION
        else
            PROJECT="@alfresco\/adf-$PROJECT"
            echo "├─ $PROJECT@$VERSION"
            update_dependency_version $PROJECT $VERSION
        fi
    done
}

update_library_dependencies() {
    DESTDIR="$DIR/../lib/$1"
    cd $DESTDIR
    update_dependencies $1
}

update_root_dependencies() {
    echo "====== Root package.json ======"
    DESTDIR="$DIR/../"
    cd $DESTDIR
    update_dependencies
}

update_root_js_api_version(){
    echo "====== $DESTDIR/@alfresco/js-api@$1 ======"
    DESTDIR="$DIR/../"
    cd $DESTDIR
    update_dependency_version "@alfresco\/js-api" $1
}

update_component_js_version(){
   echo "====== $1/@alfresco/js-api@$2 ======"
   DESTDIR="$DIR/../lib/$1"
   cd $DESTDIR
   update_dependency_version "@alfresco\/js-api" $2
}

while [[ $1  == -* ]]; do
    case "$1" in
      -h|--help|-\?) show_help; exit 0;;
      -v|version) version_change $2; shift 2;;
      -vj|versionjsapi)  version_js_change $2; shift 2;;
      -gnu) gnu_mode; shift;;
      -nextalpha) next_alpha_mode; shift;;
      -*) shift;;
    esac
done

if $GNU; then
    sedi='-i'
else
    sedi=('-i' '')
fi

if [[ "${VERSION}" == "" ]]
then
    echo "Version number required"
    exit 1
fi

echo "====== UPDATE COMPONENT LIBRARIES ======"
cd "$DIR/../"

for PROJECT in ${projects[@]}
do
    update_library_version $PROJECT
    update_library_dependencies $PROJECT

    if $JS_API == true; then
        if $DIFFERENT_JS_API == true; then
            update_component_js_version $PROJECT $JS_API_VERSION
        else
            update_component_js_version $PROJECT $VERSION
        fi
    fi
done

update_root_dependencies

if $JS_API == true; then
    if $DIFFERENT_JS_API == true; then
        update_root_js_api_version $JS_API_VERSION
    else
        update_root_js_api_version $VERSION
    fi
fi

# bump root package.json
npm version --allow-same-version --no-git-tag-version --force --loglevel=error $VERSION