#!/bin/bash

# 
#   Copyright 2016 RIFT.IO Inc
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

usage() {
	echo "usage: launch_ui.sh [--enable-https --keyfile-path=<keyfile_path> --certfile-path=<certfile-path>]"
}

function handle_received_signal() {
    forever stopall
    echo "Stopped Skyquake and API servers started with forever"
    exit
}


start_servers() {
	cd $THIS_DIR
	echo "Stopping any previous instances of Skyquake and API servers started with forever"
	forever stopall


	echo "Running Node.js Skyquake server. HTTPS Enabled: ${ENABLE_HTTPS}"
	cd ..
	if [ ! -z "${ENABLE_HTTPS}" ]; then
		forever start -a -l /dev/null -o out.log -e err.log skyquake.js	--enable-https --keyfile-path="${KEYFILE_PATH}" --certfile-path="${CERTFILE_PATH}"
	else
		forever start -a -l /dev/null -o out.log -e err.log skyquake.js
	fi
}

function extract_node_modules() {
    tar xf node_modules.tar
    touch timestamp.txt
}

function handle_plugin_node_modules() {
    cd $THIS_DIR
    echo "Handling plugin node modules"

    cd ../plugins
    for dir in */; do
        echo "Checking plugin "${dir}" for newer node_modules"
        cd ${dir}
        if [ ! -f timestamp.txt ]; then
            echo "timestamp file not found ... node_modules need to be expanded and timestamp needs to be touched"
            extract_node_modules
        else
            echo "Checking if node_modules.tar has a newer timestamp than timestamp.txt"
            if [[ node_modules.tar -nt timestamp.txt ]]; then
                echo "node_modules.tar is newer than timestamp ... node modules need to be expanded and timestamp needs to be touched"
                extract_node_modules
            else
                echo "node_modules.tar is older than timestamp ... nothing needs to be done"
            fi
        fi
        cd ..
        echo "Checking plugin "${dir}" for newer node_modules ...done"
    done
}


# Begin work
for i in "$@"
do
case $i in
    -k=*|--keyfile-path=*)
    KEYFILE_PATH="${i#*=}"
    shift # past argument=value
    ;;
    -c=*|--certfile-path=*)
    CERTFILE_PATH="${i#*=}"
    shift # past argument=value
    ;;
    -h|--help)
    usage
    exit
    ;;
    -e|--enable-https)
    ENABLE_HTTPS=YES
    shift # past argument=value
    ;;
    *)
        # unknown option
    ;;
esac
done

if [[ ! -z "${ENABLE_HTTPS}" ]]; then
	if [ -z "${KEYFILE_PATH}" ] || [ -z "${CERTFILE_PATH}" ]; then
		usage
		exit
	fi
fi


# change to the directory of this script
THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

# Call function to handle tarred node_modules as cpack+RPM cannot handle a lot of files
handle_plugin_node_modules

# Call function to start web and API servers
start_servers


# Ensure that the forever script is stopped when this script exits
trap "echo \"Received EXIT\"; handle_received_signal" EXIT
trap "echo \"Received SIGINT\"; handle_received_signal" SIGINT
trap "echo \"Received SIGKILL\"; handle_received_signal" SIGKILL
trap "echo \"Received SIGABRT\"; handle_received_signal" SIGABRT
trap "echo \"Received SIGQUIT\"; handle_received_signal" SIGQUIT
trap "echo \"Received SIGSTOP\"; handle_received_signal" SIGSTOP
trap "echo \"Received SIGTERM\"; handle_received_signal" SIGTERM
trap "echo \"Received SIGTRAP\"; handle_received_signal" SIGTRAP

# Keep this script in the foreground so the system doesn't think that the
# server crashed.
while true; do
  sleep 5
done
