g#!/bin/bash

set -e
# on pourra inclure le fichier dockers.env pour
# gérer l' environnement DEV, PROD ou LOCAL

KAZ_ROOT=$(cd "$(dirname $0)/.."; pwd)
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
setKazVars
export VAGRANT_SRC_DIR=/vagrant/files
cd "${KAZ_ROOT}"

if [ ! -f "${KAZ_ROOT}/config/dockers.env" ]; then
    printKazError "dockers.env not found"
    exit 1
fi
for type in mail orga proxy withMail withoutMail ; do
    if [ ! -f "${KAZ_ROOT}/config/container-${type}.list" ]; then
	printKazError "container-${type}.list not found"
	exit 1
    fi
done

mkdir -p "${KAZ_ROOT}/log/"
export DebugLog="${KAZ_ROOT}/log/log-install-$(date +%y-%m-%d-%T)-"
(
    declare -a DOCKERS_LIST NEW_SERVICE
    # dockers à démarrer (manque : sympa, wordpress, orga)
    DOCKERS_LIST+=($(getList "${KAZ_CONF_DIR}/container-withoutMail.list"))
    DOCKERS_LIST+=($(getList "${KAZ_CONF_DIR}/container-proxy.list"))
    DOCKERS_LIST+=($(getList "${KAZ_CONF_DIR}/container-mail.list"))
    DOCKERS_LIST+=($(getList "${KAZ_CONF_DIR}/container-withMail.list"))
    # web  proxy  postfix sympa roundcube jirafeau ldap quotas cachet ethercalc etherpad framadate paheko dokuwiki gitea mattermost cloud collabora
    # 8080 443                  8081      8082     8083 8084   8085   8086      8087     8088      8089     8090     8091  8092       8093  8094
    # pour ne tester qu'un sous-ensemble de service
    if [ $# -ne 0 ]; then
	case $1 in
	    -h*|--h*)
		echo $(basename "$0") " [-h] [-help] ([1-9]* | {service...})"
		echo "    -h"
		echo "    -help Display this help."
		echo "    service.. service to enable"
		echo "    [1-9]* level of predefined services set selection"
		exit
		;;
	    0)
		echo $(basename "$0"): " level '0' not defined"
		exit
		;;
	    [0-9]*)
		for level in $(seq 1 $1); do
		    case ${level} in
			1)  NEW_SERVICE+=("web" "proxy");;
			2)  NEW_SERVICE+=("postfix");;
			3)  NEW_SERVICE+=("roundcube");;
			4)  NEW_SERVICE+=("sympa");;
			5)  NEW_SERVICE+=("jirafeau");;
			6)  NEW_SERVICE+=("ldap");;
			7)  NEW_SERVICE+=("quotas");;
			8)  NEW_SERVICE+=("cachet");;
			9)  NEW_SERVICE+=("ethercalc");;
			10) NEW_SERVICE+=("etherpad");;
			11) NEW_SERVICE+=("framadate");;
			12) NEW_SERVICE+=("paheko");;
			13) NEW_SERVICE+=("dokuwiki");;
			14) NEW_SERVICE+=("gitea");;
			15) NEW_SERVICE+=("mattermost");;
			16) NEW_SERVICE+=("collabora");;
			17) NEW_SERVICE+=("cloud");;
			*)
			    echo $(basename "$0"): " level '${level}' not defined"
			    exit
			    ;;
		    esac
		done
		DOCKERS_LIST=(${NEW_SERVICE[@]})
		printKazMsg "level $1"
		;;
	    *)
		# XXX il manque l'extention des noms (jir va fair le start de jirafeau mais pas le download et le first)
		DOCKERS_LIST=($*)
		;;
	esac
    fi

    DOCKERS_LIST=($(filterAvailableComposes ${DOCKERS_LIST[*]}))

    printKazMsg "dockers: ${DOCKERS_LIST[*]}"

    # on pré-télécharge à l'origine Vagrant (jirafeau...)
    mkdir -p "${KAZ_ROOT}/git" "${KAZ_ROOT}/download"
    for DOCKER in ${DOCKERS_LIST[@]}; do
	if [ -f "${KAZ_ROOT}/dockers/${DOCKER}/download.sh" ]; then
	    cd "${KAZ_ROOT}/dockers/${DOCKER}"
	    ./download.sh
	fi
    done

    # on pré-télécharge le dépollueur
    if [[ " ${DOCKERS_LIST[*]} " =~ " "(jirafeau|postfix|sympa)" " ]]; then
        "${KAZ_BIN_DIR}/installDepollueur.sh"
        docker volume create filterConfig
    fi

    # on sauve les pré-téléchargement pour le prochain lancement de Vagrant
    [ -d "${VAGRANT_SRC_DIR}/kaz/download" ] &&
	rsync -a  "${KAZ_ROOT}/download/" "${VAGRANT_SRC_DIR}/kaz/download/"
    [ -d "${VAGRANT_SRC_DIR}/kaz/git" ] &&
	rsync -a "${KAZ_ROOT}/git/" "${VAGRANT_SRC_DIR}/kaz/git/"

    # on construit les dockers qui contiennent un script de création (etherpad, framadate, jirafeau...)
    for DOCKER in ${DOCKERS_LIST[@]}; do
	if [ -f "${KAZ_ROOT}/dockers/${DOCKER}/build.sh" ]; then
	    cd "${KAZ_ROOT}/dockers/${DOCKER}"
	    ./build.sh
	fi
    done

    # on démare les containers de la liste uniquement (en une fois par cohérence de proxy)
    # "${KAZ_ROOT}/bin/container.sh" stop ${DOCKERS_LIST[*]}
    "${KAZ_ROOT}/bin/container.sh" start ${DOCKERS_LIST[*]}

    if [[ " ${DOCKERS_LIST[*]} " =~ " traefik " ]]; then
      # on initialise traefik :-(
      ${KAZ_COMP_DIR}/traefik/first.sh
      # on démarre traefik (plus lancé dans container.sh)
      docker-compose -f ${KAZ_COMP_DIR}/traefik/docker-compose.yml up -d
    fi

    if [[ " ${DOCKERS_LIST[*]} " =~ " etherpad " ]]; then
	# pb avec la lanteur de démarrage du pad :-(
	sleep 5
	"${KAZ_ROOT}/bin/container.sh" start etherpad
    fi


    if [[ " ${DOCKERS_LIST[*]} " =~ " jirafeau " ]]; then
	# pb avec la lanteur de démarrage du jirafeau :-(
	(cd "${KAZ_COMP_DIR}/jirafeau" ; docker-compose restart)
    fi

    # on construit les dockers qui contiennent un script de création (etherpad, framadate, jirafeau...)
    for DOCKER in ${DOCKERS_LIST[@]}; do
	if [ -f "${KAZ_ROOT}/dockers/${DOCKER}/first.sh" ]; then
	    cd "${KAZ_ROOT}/dockers/${DOCKER}"
	    ./first.sh
	fi
    done

    echo "########## ********** End install $(date +%D-%T)"
)  > >(tee ${DebugLog}stdout.log) 2> >(tee ${DebugLog}stderr.log >&2)
