#!/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
exportProperties ${SCRIPT_DIR}/config/config
exportProperties ${SCRIPT_DIR}/setup/versions

#export INSTALL_TYPE=singlenode
export INSTALL_FRONTEND=false
export INSTALL_MIDDLEWARE=false
export INSTALL_GUARD=false
export INSTALL_DOCUMENTS=false
export INSTALL_DATABASE=false
# export REMOTE_HOST=
# export REMOTE_SSH_KEY=

## 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
        --dovecot       not yet supported

    Installation types (not combineable):
        --singlenode    This will install all of the above (except dovecot)
        --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

Examples:

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


"
}

### 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)
    INSTALL_MIDDLEWARE=true
    shift
    ;;
    --frontend)
    INSTALL_FRONTEND=true
    shift
    ;;
    --database)
    INSTALL_DATABASE=true
    shift
    ;;
    --guard)
    INSTALL_GUARD=true
    shift
    ;;
    --documents)
    INSTALL_DOCUMENTS=true
    shift
    ;;
    --dovecot)
    INSTALL_DOVECOT=true
    shift
    ;;
    --singlenode)
    INSTALL_DATABASE=true
    INSTALL_MIDDLEWARE=true
    INSTALL_FRONTEND=true
    export INSTALL_TYPE=singlenode
    export INIT=true
    shift
    ;;
    --docker)
    export INSTALL_TYPE=docker
    shift
    ;;
    --build-docker)
    INSTALL_TYPE=build_docker
    shift
    ;;
    --init)
    export INIT=true
    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

if [ -z $INSTALL_TYPE ]; then
    show_usage
    echo ""
    echo "Please provide the install type with --singlenode or --build-docker (see above)"
    exit 99
elif [[ "${INSTALL_TYPE}" == "build_docker" ]]; then
    echo ""

    docker build --no-cache --rm -f docker/groupware.dockerfile -t middleware:latest .
    exit 0
fi

echo "Preparing this environment for setup ..."
checkRootPrivileges
detectDistribution

preInstallActions 
writeRepositories
addOxBuildKey


echo "... environment should be ready."
echo "Starting OX installation with the following configuration:"
echo ""
set | grep INSTALL_
echo "===   (CTRL+C to cancel)   ==="
sleep 5

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

if [ "$INSTALL_FRONTEND" = true ] ; then
    setup/install-frontend.sh
    if [ "$INIT" = true ] ; then
        config/init-frontend.sh
    fi
    
fi

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

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

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

if [ "$INSTALL_MIDDLEWARE" = true ] && [ "${INIT}" = true ]; then
    config/init-middleware.sh \
        --mail-host dovecot.qa.open-xchange.com \
        --mail-domain qa.open-xchange.com
fi

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

popd