#!/bin/sh

# Copyright 2019 Mycroft AI 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.

script=${0}
script=${script##*/}

help() {
	echo "${script}:  Mycroft command/service launcher"
	echo "usage: ${script} [COMMAND] [restart] [params]"
	echo
	echo "Services COMMANDs:"
	echo "  all                      runs core services: bus, audio, skills, voice"
	echo "  debug                    runs core services, then starts the CLI"
	echo "  audio                    the audio playback service"
	echo "  bus                      the messagebus service"
	echo "  skills                   the skill service"
	echo "  voice                    voice capture service"
	echo "  enclosure                mark_1 enclosure service"
	echo
	echo "Tool COMMANDs:"
	echo "  cli                      the Command Line Interface"
	echo
	echo "Options:"
	echo "  restart                  (optional) Force the service to restart if running"
	echo
	echo "Examples:"
	echo "  ${script} all"
	echo "  ${script} all restart"
	echo "  ${script} bus"
	echo "  ${script} voice"

	exit 1
}

name_to_script_path() {
	case ${1} in
		"bus")		_module="mycroft.messagebus.service" ;;
		"skills")	_module="mycroft.skills" ;;
		"audio")	_module="mycroft.audio" ;;
		"voice")	_module="mycroft.client.speech" ;;
		"cli")		_module="mycroft.client.text" ;;
		"enclosure")	_module="mycroft.client.enclosure" ;;

		*)
			echo "Error: Unknown name '${1}'"
			exit 1
	esac
}

require_process() {
	name_to_script_path "${1}"
	if ! pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
		launch_background "${1}"
	fi
}

launch_process() {
	name_to_script_path "${1}"

	# Luanch process in foreground
	echo "Starting $1"
	python3 -m ${_module} "$_params"
}

launch_background() {
	name_to_script_path "${1}"

	if pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
		if ($_force_restart); then
			echo "Restarting: ${1}"
			mycroft-stop "${1}"
		else
			# Already running, no need to restart
			return
		fi
	else
		echo "Starting background service $1"
	fi

	# Security warning/reminder for the user
	if [ "${1}" = "bus" ] ; then
		echo "CAUTION: The Mycroft bus is an open websocket with no built-in security"
		echo "         measures.  You are responsible for protecting the local port"
		echo "         8181 with a firewall as appropriate."
	fi

	# Launch process in background
	# Send logs to XDG Base Directories cache location
	if [ -n "${XDG_CACHE_HOME+x}" ]; then
		logdir="$XDG_CACHE_HOME/mycroft"
	else
		logdir="$HOME/.cache/mycroft"
	fi

	if [ ! -d "$logdir" ]; then
		mkdir -p "$logdir"
	fi

	python3 -m ${_module} "$_params" >> "$logdir/${1}.log" 2>&1 &
}

launch_all() {
	echo "Starting all mycroft-core services"
	launch_background bus
	launch_background skills
	launch_background audio
	launch_background voice
	launch_background enclosure
}

_opt=$1
_force_restart=false
shift
if [ "${1}" = "restart" ] || [ "${_opt}" = "restart" ]; then
	_force_restart=true
	if [ "${_opt}" = "restart" ]; then
		# Support "start-mycroft restart all" as well as "start-mycroft all restart"
		_opt=$1
	fi
	shift
fi
_params=$*

case ${_opt} in
	"all")
		launch_all
		;;
	"bus")
		launch_background "${_opt}"
		;;
	"audio")
		launch_background "${_opt}"
		;;
	"skills")
		launch_background "${_opt}"
		;;
	"voice")
		launch_background "${_opt}"
		;;
	"debug")
		launch_all
		launch_process cli
		;;
	"cli")
		require_process bus
		require_process skills
		launch_process "${_opt}"
		;;
	"enclosure")
		launch-background "${_opt}"
		;;
	*)
		help
		;;
esac
