#!/bin/bash
#
# .---.                  .              .
# |                      |              |
# |--- .--. .-.  .-.  .-.|  .-. .--.--. |.-.  .-. .--.  .-.
# |    |   (.-' (.-' (   | (   )|  |  | |   )(   )|  | (.-'
# '    '     --'  --'  -' -  -' '  '   -' -'   -' '   -  --'
#
#                    Freedom in the Cloud
#
# This install script is intended for use with Debian Jessie
#
# License
# =======
#
# Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

NO_OF_ARGS=$#

PROJECT_NAME='freedombone'

export TEXTDOMAIN=$PROJECT_NAME
export TEXTDOMAINDIR="/usr/share/locale"

PROJECT_INSTALL_DIR=/usr/local/bin
if [ -f /usr/bin/${PROJECT_NAME} ]; then
	PROJECT_INSTALL_DIR=/usr/bin
fi

source $PROJECT_INSTALL_DIR/${PROJECT_NAME}-vars

command_options=$1

if [[ $command_options == "menuconfig-full" ]]; then
	MINIMAL_INSTALL="no"
	command_options="menuconfig"
fi

if [[ $command_options == "menuconfig-onion" ]]; then
	MINIMAL_INSTALL="yes"
	ONION_ONLY="yes"
	command_options="menuconfig"
fi

if [[ $command_options == "menuconfig" ]]; then
	interactive_configuration
else
	while [[ $# > 1 ]]
	do
		key="$1"

		case $key in
			-h|--help)
				show_help
				;;
			# load a configuration file
			-c|--config)
				shift
				CONFIGURATION_FILE="$1"
				INSTALLING_FROM_CONFIGURATION_FILE="yes"
				break
				;;
			# username within /home
			-u|--user)
				shift
				MY_USERNAME="$1"
				;;
			# microblog domain name
			--microblogdomain)
				shift
				MICROBLOG_DOMAIN_NAME="$1"
				;;
			# wiki domain name
			--wikidomain)
				shift
				WIKI_DOMAIN_NAME="$1"
				;;
			# blog domain name
			--blogdomain)
				shift
				FULLBLOG_DOMAIN_NAME="$1"
				;;
			# hubzilla domain name
			--hubzilladomain)
				shift
				HUBZILLA_DOMAIN_NAME="$1"
				;;
			# git hosting domain name
			--gitdomain)
				shift
				GIT_DOMAIN_NAME="$1"
				;;
			# default domain name
			-d|--domain)
				shift
				DEFAULT_DOMAIN_NAME="$1"
				;;
			# The type of system
			-s|--system)
				shift
				SYSTEM_TYPE="$1"
				;;
			# The dynamic DNS provider
			--ddns)
				shift
				DDNS_PROVIDER="$1"
				;;
			# Username for the synamic DNS provider
			--ddnsuser)
				shift
				DDNS_USERNAME="$1"
				;;
			# Password for the synamic DNS provider
			--ddnspass)
				shift
				DDNS_PASSWORD="$1"
				;;
			# Whether this installation is on a Beaglebone Black
			--bbb)
				INSTALLING_ON_BBB="yes"
				;;
			# Domain name to use as a TLS time source
			-t|--time)
				shift
				TLS_TIME_SOURCE1="$1"
				;;
			# Static IP address for the system
			--ip)
				shift
				LOCAL_NETWORK_STATIC_IP_ADDRESS=$1
				;;
			# IP address for the internet router
			--iprouter)
				shift
				ROUTER_IP_ADDRESS=$1
				;;
			# ssh port
			--ssh)
				shift
				SSH_PORT=$1
				;;
			# public mailing list name
			--list)
				shift
				PUBLIC_MAILING_LIST="$1"
				;;
			# Number of CPU cores
			--cores)
				shift
				CPU_CORES=$1
				;;
			# my name
			--name)
				shift
				MY_NAME="$1"
				;;
			# my email address
			--email)
				shift
				MY_EMAIL_ADDRESS="$1"
				;;
			# USB drive
			--usb)
				shift
				USB_DRIVE=$1
				;;
			# Enable CJDNS
			--cjdns)
				shift
				ENABLE_CJDNS="yes"
				;;
			# Enable B.A.T.M.A.N
			--batman)
				shift
				ENABLE_BATMAN="yes"
				;;
			# Enable Babel
			--babel)
				shift
				ENABLE_BABEL="yes"
				;;
			# VoIP server password
			--vpass)
				shift
				VOIP_SERVER_PASSWORD=$1
				;;
			# VoIP server port
			--vport)
				shift
				VOIP_PORT=$1
				;;
			# DNS Nameserver 1
			--ns1)
				shift
				NAMESERVER1=$1
				;;
			# DNS Nameserver 2
			--ns2)
				shift
				NAMESERVER2=$1
				;;
			# Debian repository
			--repo)
				shift
				DEBIAN_REPO=$1
				;;
			# minimal install
			--minimal)
				shift
				MINIMAL_INSTALL=$1
				;;
			*)
				# unknown option
				;;
		esac
		shift
	done
fi

function parse_args {
	if [[ $NO_OF_ARGS == 0 ]]; then
		echo 'no_of_args = 0'
		show_help
		exit 0
	fi

	if [ ! -d /home/$MY_USERNAME ]; then
		echo $"There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
		exit 1
	fi
	if [ ! "$DEFAULT_DOMAIN_NAME" ]; then
		if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
			echo 'No default domain specified'
			show_help
			exit 2
		fi
	fi
	if [ ! $MY_USERNAME ]; then
		echo 'No username specified'
		show_help
		exit 3
	fi
	if [[ $SYSTEM_TYPE != "$VARIANT_MESH" ]]; then
		if [[ $ONION_ONLY == "no" ]]; then
			if [ ! $DDNS_USERNAME ]; then
				echo $'Please provide the username for your dynamic DNS provider with the --ddnsuser option'
				exit 7823
			fi
			if [ ! $DDNS_PASSWORD ]; then
				echo $'Please provide the password for your dynamic DNS provider with the --ddnspass option'
				exit 6382
			fi
		fi
	fi
	if [ ! $SYSTEM_TYPE ]; then
		SYSTEM_TYPE=$VARIANT_FULL
	fi
	if [[ $SYSTEM_TYPE != $VARIANT_WRITER && $SYSTEM_TYPE != $VARIANT_CLOUD && $SYSTEM_TYPE != $VARIANT_CHAT && $SYSTEM_TYPE != $VARIANT_MAILBOX && $SYSTEM_TYPE != $VARIANT_NONMAILBOX && $SYSTEM_TYPE != $VARIANT_SOCIAL && $SYSTEM_TYPE != $VARIANT_MEDIA && $SYSTEM_TYPE != $VARIANT_DEVELOPER && $SYSTEM_TYPE != $VARIANT_MESH && $SYSTEM_TYPE != $VARIANT_FULL ]]; then
		echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant."
		exit 30
	fi
}

# run some initial tests
${PROJECT_NAME}-tests
if [ ! "$?" = "0" ]; then
	exit 768252
fi

setup_utils
setup_email
setup_web
setup_apps
setup_final

echo "${PROJECT_NAME} installation is complete"
exit 0
