#!/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

UTILS_FILES=/usr/share/${PROJECT_NAME}/utils/${PROJECT_NAME}-utils-*
for f in $UTILS_FILES
do
  source $f
done

APP_FILES=/usr/share/${PROJECT_NAME}/apps/${PROJECT_NAME}-app-*
for f in $APP_FILES
do
  source $f
done

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"
                ;;
            # 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"
                ;;
            # Mumble server password
            --vpass)
                shift
                MUMBLE_SERVER_PASSWORD=$1
                ;;
            # Mumble server port
            --vport)
                shift
                MUMBLE_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

    read_config_param 'DEFAULT_DOMAIN_NAME'
    read_config_param 'MY_USERNAME'
    read_config_param 'SYSTEM_TYPE'
    read_config_param 'ONION_ONLY'

    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 != "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 != "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=$'full'
        write_config_param "SYSTEM_TYPE" "$SYSTEM_TYPE"
    fi

    if [[ $(is_valid_variant) == "0" ]]; then
        echo $"'$SYSTEM_TYPE' is an unrecognised ${PROJECT_NAME} variant. Possible variants are:"
        show_available_variants
        exit 367245
    fi
}

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

upgrade_installation_from_previous_versions
setup_utils
setup_email
setup_web
setup_apps
setup_final

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