#!/bin/bash

#Copyright CloudLinux Zug GmbH 2010-2017 All Rights Reserved
#
#Licensed under CLOUD LINUX LICENSE AGREEMENT
#http://cloudlinux.com/docs/LICENSE.TXT

set -e

DEFAULT_USER_NAME='user1'
DEFAULT_USER_MAIN_DOMAINS='user1.com second-user1.com second-user1.user1.com third-user1.com third-user1.user1.com'
DEFAULT_STARTUP_FILE='app.js'
NODEJS_VERSIONS_LIST=( '6' '8' '9' '10' )

RESOURCE_FOLDER='/usr/share/l.v.e-manager/spa/scripts/resources/nodejs/'

# ============================ Preparation =====================================
if [[ -z "$1" ]] || !([[ "$1" == "prepare" ]] || [[ "$1" == "clean" ]]); then
    echo 'Specify action (prepare|clean)'
    exit 1
fi

if [[ -z "$2" ]]; then
    USER_NAME=$DEFAULT_USER_NAME
else
    USER_NAME="$2"
fi

if [[ -z "$3" ]]; then
    USER_MAIN_DOMAINS=$DEFAULT_USER_MAIN_DOMAINS
else
    USER_MAIN_DOMAINS="$3"
fi

# ============================ Functions =======================================
function create_application {
    app_name=$1
    app_uri=$2
    version=$3
    if [[ -z "$4" ]]; then
        startup_file=$DEFAULT_STARTUP_FILE
    else
        startup_file=$4
    fi
    cloudlinux-selector create --json --interpreter nodejs --user "$USER_NAME" \
        --app-root "$app_name" --app-uri "$app_uri" --version "$version" \
        --app-mode development --startup-file "$startup_file"

    files="package.json test.js"
    for file in $files; do
        cp "$RESOURCE_FOLDER/$file" \
        "/home/$USER_NAME/$app_name/$file"
        chown -R "$USER_NAME:$USER_NAME" "/home/$USER_NAME/$app_name/$file"
    done
}

function destroy_application {
    app_name=$1
    cloudlinux-selector destroy --json --interpreter nodejs --user "$USER_NAME" \
        --app-root "$app_name"
    rm -rf "/home/$USER_NAME/$app_name"
    rm -rf "/home/$USER_NAME/public_html/$app_name"
}

function destroy_all_applications {
    for app in `ls "/home/$USER_NAME/nodevenv"`
    do
        destroy_application "$app"
    done
}

function install_node_modules {
    app_name=$1
    cloudlinux-selector install-modules --json --interpreter=nodejs \
        --user "$USER_NAME" --app-root "$app_name"
}

function install_alt_nodejs_all_versions {
    for version in "${NODEJS_VERSIONS_LIST[@]}"; do
        is_exist=$(rpm -qa alt-nodejs$version)
        if [ ! "${is_exist}" ]; then
            yum groupinstall alt-nodejs$version -y
        fi
    done
}

function set_default_version {
    version=$1
    cloudlinux-selector set --json --interpreter=nodejs --default-version="$version"
}

function enabled_all_version {
    for version in "${NODEJS_VERSIONS_LIST[@]}"; do
        cloudlinux-selector enable-version --json --interpreter nodejs --version $version
    done
}

function prepare_host {
    hostnames=$1
    IP=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')
    echo "$IP          $hostnames" >> /etc/hosts
}

function remove_host {
    hostnames=$1
    sed -i -e "/$hostnames$/d" /etc/hosts
}

function prepare_application_from_zip {
    app_name=$1
    version=$2
    startup_file=$3

    create_application "$app_name" "$app_name" "$version" "$startup_file"
    unzip -o "$RESOURCE_FOLDER""$app_name.zip" -d "/home/$USER_NAME/$app_name"
    chown -R "$USER_NAME:$USER_NAME" "/home/$USER_NAME/$app_name"
    install_node_modules "$app_name"
}

function prepare_big_application {
    prepare_application_from_zip "bigApplication" 8
}

function prepare_medium_application {
    prepare_application_from_zip "mediumApplication" 8 "server.js"
}

function prepare_nodejs_selector {
    cloudlinux-limits set --json --username="$USER_NAME" --unlimited
    prepare_host "$USER_MAIN_DOMAINS"
    install_alt_nodejs_all_versions

    for (( i = 1; i <= 6; i++ )); do
        create_application "app$i" "app$i" 6
    done
    for (( i = 7; i <= 10; i++ )); do
        create_application "app$i" "app$i" 8
    done
    install_node_modules "app1"
    #TODO: change to preparation of "big application" when LU-720 will be ready
    prepare_medium_application
}

function clean_environment_nodejs_selector {
    destroy_all_applications
    remove_host "$USER_MAIN_DOMAINS"
    enabled_all_version
    set_default_version 6
}

# ============================ Main part =======================================

if [[ "$1" = "prepare" ]]; then
    prepare_nodejs_selector
elif [[ "$1" = "clean" ]]; then
    clean_environment_nodejs_selector
fi

exit 0
