#!/bin/bash
#
# Copyright (C) 2019 OX Software GmbH
# 
# This file is part of OX Automation.
#
# OX Automation is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OX Automation 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OX Automation. If not, see <http://www.gnu.org/licenses/>.
#
#
# Authors:
# Benedikt Kroening <benedikt.kroening@open-xchange.com>
#
set -e
SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P)"

pushd ${SCRIPT_DIR}
STARTED_AT=$(date)

# sourcing some commonly used functions and executing basic checks
source ${SCRIPT_DIR}/lib/common.bash
source ${SCRIPT_DIR}/lib/setup.bash

# sourcing the default configuration to use
# This may be overriden by some argument below
# This config file will still be loaded to provide defaults
exportProperties ${SCRIPT_DIR}/config/config
exportProperties ${SCRIPT_DIR}/setup/versions

# checking if Install variables are set, if not default will be set to false
checkInstallDefaults

## Help text
show_usage() {
echo -n "

This scripts lets you install a fully fledged Open-Xchange App Suite 
environment with configured database and dovecot backends.

Easiest way to get a working OX App Suite this:
    $ ./ox-installer.sh --singlenode

    Per component options (can be combined):
        --middleware    Installs middleware components
        --frontend      Installs frontnend with apache2 balancer
        --guard         not yet supported
        --documents     not yet supported
        --database      Installs mysql or mariadb server
        -d | --dovecot       Installs local only dovecot test server

    Installation types (not combineable):
        -s | --singlenode    This will install and init an basic OX instance (db, mw, fe)
        --build-docker  This will install everything inside docker (you have to provide the components to install)

    Configuration options:
        --init          This will start configuration scripts after component installation
        --config <file> Configuration file to load

Examples:

Singlenode setup with everything you need:
    $ ./ox-installer.sh --singlenode --dovecot

"
}

### reading config from command line; overriding defaults
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -h|--help)
    show_usage
    exit 0
    shift
    ;;
    --debug)
    echo "WARNING: Debug flag set (--debug)"
    set -x
    shift
    ;;
    # -t|--type)
    # INSTALL_TYPE="$2"
    # shift
    # shift
    # ;;
    --middleware)
    export INSTALL_MIDDLEWARE=true
    shift
    ;;
    --frontend)
    export INSTALL_FRONTEND=true
    shift
    ;;
    --database)
    export INSTALL_DATABASE=true
    shift
    ;;
    --guard)
    export INSTALL_GUARD=true
    shift
    ;;
    --documents)
    export INSTALL_DOCUMENTS=true
    shift
    ;;
    --documentconverter)
    export INSTALL_DOCUMENTCONVERTER=true
    shift
    ;;
    -d|--dovecot)
    export INSTALL_DOVECOT=true
    export OX_MAIL_HOST=localhost
    export OX_MAIL_DOMAIN=$(hostname)
    echo "WARNING: overriding OX_MAIL_HOST and OX_MAIL_DOMAIN with local only dovecot configuration!"
    sleep 3
    shift
    ;;
    -s|--singlenode)
    export INSTALL_DATABASE=true
    export INSTALL_MIDDLEWARE=true
    export INSTALL_FRONTEND=true
    export INSTALL_TYPE=singlenode
    export INIT=true
    shift
    ;;
    --docker)
    export INSTALL_TYPE=docker
    export INIT=false
    shift
    ;;
    # --build-docker)
    # export INSTALL_TYPE=build_docker
    # export INIT=false
    # shift
    # ;;
    --init)
    export INIT=true
    shift
    ;;
    --config)
    exportProperties "$2"
    shift
    shift
    ;;
    # --repo-guard)
    # OX_REPO_GUARD="$2"
    # echo "WARNING: Using $OX_REPO_GUARD as guard repository source"
    # shift 
    # shift 
    # ;;
    *) # unknown option
    echo "Unknonwn option: $1"
    POSITIONAL+=("$1") # save it in an array for later
    shift 
    ;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters


echo ""
echo "Setup checks done... Setup will install an OX with following modules:"
echo "===   (CTRL+C to cancel)   ==="
printenv | grep INSTALL_
echo "The following versions will be used:"
printenv | grep AS_
echo "===   (CTRL+C to cancel)   ==="
sleep 5

if [ -z ${INSTALL_TYPE} ]; then
    echo "No install type specified. We will see what happens ..."
fi

checkRootPrivileges
detectDistribution


preInstallActions 
writeRepositories
addOxBuildKey

if [ "$INSTALL_DATABASE" = true ] ; then
    setup/install-database.sh
fi

if [ "$INSTALL_MIDDLEWARE" = true ] ; then
    # Install OX middleware (optionally with guard and documents enabled)
    setup/install-middleware.sh
fi

if [ "$INSTALL_DOCUMENTCONVERTER" = true ] ; then
    setup/install-documentconverter.sh
fi

if [ "$INSTALL_FRONTEND" = true ] ; then
    # Install OX App Suite frontend (optionally with guard and documents)
    setup/install-frontend.sh
fi


if [ "$INSTALL_GUARD" = true ] ; then
    if [[ "${INSTALL_TYPE}" == "singlenode" ]]; then
        # ensure that all components will be "force" installed if on singlenode
        features/guard.sh --install --middlware --backend --frontend
    else
        # let the environment variables do the selection magic 
        features/guard.sh --install
    fi
fi 

if [ "$INSTALL_DOVECOT" = true ] ; then
    setup/install-dovecot.sh -s 
fi 

if [ "${INIT}" = true ]; then
    if [ "$INSTALL_DATABASE" = true ] ; then
        config/init-database.sh
    fi

    if [ "$INSTALL_FRONTEND" = true ] ; then
        config/init-frontend.sh    
    fi
    
    if [ "$INSTALL_MIDDLEWARE" = true ] ; then
        config/init-middleware.sh 
    fi

    if [ "$INSTALL_GUARD" = true ] ; then
        features/guard.sh --enable --restart
    fi

fi

FINISHED_AT=$(date)
echo "====================================================================================="
echo "Started at:   $STARTED_AT"
echo "Finished at:  $FINISHED_AT"

popd