#!/bin/bash

# for backwards compatability
if [ -z ${SYNOPKG_PKGDEST_VOL} ]; then
	SYNOPKG_PKGDEST_VOL="/volume1"
fi
SHAREDIR="${SYNOPKG_PKGNAME}"

quote_json ()
{
	sed -e 's|\\|\\\\|g' -e 's|\"|\\\"|g'
}

page_append ()
{
	if [ -z "$1" ]; then
		echo "$2"
	elif [ -z "$2" ]; then
		echo "$1"
	else
		echo "$1,$2"
	fi
}

RESTORE_BACKUP_FILE="wizard_owncloud_restore"
BACKUP_FILE_PATH="wizard_backup_file"
ERROR_TEXT="Un chemin de fichier vide n'est pas autorisé lorsque la restauration est activée."

checkBackupFile()
{
	CHECK_BACKUP_FILE=$(/bin/cat<<EOF
{
	var backupFileCheck = arguments[0];
	var step = arguments[2];
	var fileRestore = step.getComponent("${RESTORE_BACKUP_FILE}");
	if (fileRestore.checked) {
		if (backupFileCheck === "") {
			return "${ERROR_TEXT}";
		}
	}
	return true;
}
EOF
)
	echo "$CHECK_BACKUP_FILE" | quote_json
}

getBackupFile()
{
	BACKUP_FILE=$(/bin/cat<<EOF
{
	var backupFile = arguments[0];
	var step = arguments[2];
	var filePath = step.getComponent("${BACKUP_FILE_PATH}");
	if (backupFile) {
		filePath.setDisabled(false);
	} else {
		filePath.setValue("");
		filePath.setDisabled(true);
	}
	return true;
}
EOF
)
	echo "$BACKUP_FILE" | quote_json
}

jsFunction=$(/bin/cat<<EOF
	function findStepByTitle(wizardDialog, title) {
		for (var i = wizardDialog.customuiIds.length - 1 ; i >= 0 ; i--) {
			var step = wizardDialog.getStep(wizardDialog.customuiIds[i]);
			if (title === step.headline) {
				return step;
			}
		}
		return null;
	}
	function isRestoreChecked(wizardDialog) {
		var typeStep = findStepByTitle(wizardDialog, "Type d'installation d'ownCloud");
		if (!typeStep) {
			return false;
		} else {
			return typeStep.getComponent("${RESTORE_BACKUP_FILE}").checked;
		}
	}
EOF
)

getActiveate()
{
	ACTIVAETE=$(/bin/cat<<EOF
{
	${jsFunction}
	var currentStep = arguments[0];
	var wizardDialog = currentStep.owner;
	var typeStep = findStepByTitle(wizardDialog, "Type d'installation d'ownCloud");
	var adminStep = findStepByTitle(wizardDialog, "Configuration de l'administrateur d'ownCloud");
	var confirmStep = findStepByTitle(wizardDialog, "Confirmer la restauration ownCloud");
	var checked = isRestoreChecked(wizardDialog);
	if (currentStep.headline === "Configuration de l'administrateur d'ownCloud") {
		if (checked) {
			wizardDialog.goBack(typeStep.itemId);
			wizardDialog.goNext(confirmStep.itemId);
		}
	} else if (currentStep.headline === "Confirmer la restauration ownCloud") {
		if (!checked) {
			wizardDialog.goBack(typeStep.itemId);
			wizardDialog.goNext(adminStep.itemId);
		}
	}
}
EOF
)
	echo "$ACTIVAETE" | quote_json
}

getDeActiveate()
{
	DEACTIVAETE=$(/bin/cat<<EOF
{
	${jsFunction}
	var currentStep = arguments[0];
	var wizardDialog = currentStep.owner;
	var adminStep = findStepByTitle(wizardDialog, "Configuration de l'administrateur d'ownCloud");
	var domainStep = findStepByTitle(wizardDialog, "Domaines de confiance ownCloud");
	var confirmStep = findStepByTitle(wizardDialog, "Confirmer la restauration ownCloud");
	var phpStep = findStepByTitle(wizardDialog, "Plusieurs profils PHP");
	var checked = isRestoreChecked(wizardDialog);
	if (currentStep.headline === "Type d'installation d'ownCloud") {
		if (!phpStep) {
			domainStep.nextId = "applyStep";
		} else {
			domainStep.nextId = phpStep.itemId;
		}
		if (checked) {
			currentStep.nextId = confirmStep.itemId;
		} else {
			currentStep.nextId = adminStep.itemId;
		}
	}
}
EOF
)
	echo "$DEACTIVAETE" | quote_json
}

# Check for multiple PHP profiles
check_php_profiles ()
{
	SC_PKG_PREFIX="com-synocommunity-packages-"
	SC_PKG_NAME="${SC_PKG_PREFIX}${SYNOPKG_PKGNAME}"
	PHP_CFG_PATH="/usr/syno/etc/packages/WebStation/PHPSettings.json"
	if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -lt 7 ] && \
		jq -e 'to_entries | map(select((.key | startswith("'"${SC_PKG_PREFIX}"'")) and .key != "'"${SC_PKG_NAME}"'")) | length > 0' "${PHP_CFG_PATH}" >/dev/null; then
		return 0  # true
	else
		return 1  # false
	fi
}

PAGE_ADMIN_CONFIG=$(/bin/cat<<EOF
{
	"step_title": "Type d'installation d'ownCloud",
	"invalid_next_disabled_v2": true,
	"deactivate_v2": "$(getDeActiveate)",
	"items": [{
		"type": "singleselect",
		"desc": "Pour l'installation, vous avez la possibilité soit de créer une nouvelle instance, soit de restaurer à partir d'une archive de sauvegarde.",
		"subitems": [{
			"key": "wizard_owncloud_install",
			"desc": "Installer un nouveau déploiement",
			"defaultValue": true
		}, {
			"key": "${RESTORE_BACKUP_FILE}",
			"desc": "Restaurer à partir d'une archive",
			"defaultValue": false,
			"validator": {
				"fn": "$(getBackupFile)"
			}
		}]
	}, {
		"type": "textfield",
		"desc": "Veuillez fournir le chemin complet de l'archive que vous souhaitez restaurer.",
		"subitems": [{
			"key": "${BACKUP_FILE_PATH}",
			"desc": "Emplacement du fichier de sauvegarde",
			"disabled": true,
			"emptyText": "${SYNOPKG_PKGDEST_VOL}/${SYNOPKG_PKGNAME}/backup",
			"validator": {
				"fn": "$(checkBackupFile)"
			}
		}]
	}, {
		"type": "textfield",
		"desc": "Répertoire de données ownCloud",
		"subitems": [{
			"key": "wizard_data_share",
			"desc": "Partager le nom",
			"defaultValue": "${SHAREDIR}",
			"validator": {
				"allowBlank": false,
				"regex": {
					"expr": "/^[\\\w.][\\\w. -]{0,30}[\\\w.-][\\\\$]?$|^[\\\w][\\\\$]?$/",
					"errorText": "Les sous-répertoires ne sont pas pris en charge."
				}
			}
		}]
	}]
}, {
	"step_title": "Configuration de l'administrateur d'ownCloud",
	"invalid_next_disabled_v2": true,
	"activate_v2": "$(getActiveate)",
	"items": [{
		"type": "textfield",
		"desc": "Connexion de l'administrateur. Par défaut, 'admin'",
		"subitems": [{
			"key": "wizard_owncloud_admin_username",
			"desc": "Nom d'utilisateur",
			"defaultValue": "admin",
			"validator": {
				"allowBlank": false
			}
		}]
	}, {
		"type": "password",
		"desc": "Mot de passe de l'administrateur. Par défaut, 'admin'",
		"subitems": [{
			"key": "wizard_owncloud_admin_password",
			"desc": "Mot de passe",
			"defaultValue": "admin",
			"validator": {
				"allowBlank": false
			}
		}]
	}]
}, {
	"step_title": "Domaines de confiance ownCloud",
	"items": [{
		"type": "textfield",
		"desc": "Pour accéder à votre serveur ownCloud, vous devez mettre en liste blanche toutes les URL dans vos paramètres, y compris toutes les URL supplémentaires que vous souhaitez utiliser en plus du nom d'hôte actuel.",
		"subitems": [{
			"key": "wizard_owncloud_trusted_domain_1",
			"desc": "Domaine ou adresse IP",
			"emptyText": "localhost"
		}, {
			"key": "wizard_owncloud_trusted_domain_2",
			"desc": "Domaine ou adresse IP",
			"emptyText": "server1.example.com"
		}, {
			"key": "wizard_owncloud_trusted_domain_3",
			"desc": "Domaine ou adresse IP",
			"emptyText": "192.168.1.50"
		}]
	}]
}, {
	"step_title": "Confirmer la restauration ownCloud",
	"activate_v2": "$(getActiveate)",
	"items": [{
		"desc": "L'installation va maintenant se poursuivre et votre configuration précédente sera restaurée à partir de la sauvegarde. Veuillez vérifier que le chemin du fichier est exact et que l'utilisateur « sc-owncloud » dispose des autorisations de lecture pour ce chemin ; sinon, une nouvelle installation sera lancée."
	}]
}
EOF
)

PAGE_PHP_PROFILES=$(/bin/cat<<EOF
{
	"step_title": "Plusieurs profils PHP",
	"items": [{
		"desc": "Attention : Plusieurs profils PHP détectés ; la page Web du package ne s'affichera pas tant qu'un redémarrage de DSM n'aura pas été effectué pour charger de nouvelles configurations."
	}]
}
EOF
)

main () {
	local install_page=""
	install_page=$(page_append "$install_page" "$PAGE_ADMIN_CONFIG")
	if check_php_profiles; then
		install_page=$(page_append "$install_page" "$PAGE_PHP_PROFILES")
	fi
	echo "[$install_page]" > "${SYNOPKG_TEMP_LOGFILE}"
}

main "$@"
