#!/bin/bash
set -eu
### --help Info: применение файла конфигурации.
### --help Usage: /opt/bin/eva_configure [--account-sync-users]
### --help Example: /opt/bin/eva_configure
. /opt/fox_utils/crab_sys.sh
sys::arg_parse "$@"

declare DOMAIN
declare EMAIL_HOST_ADDR
declare EMAIL_PORT
declare EMAIL_USER
declare EMAIL_LOGIN
declare EMAIL_PASSWORD
declare EMAIL_USE_SSL
declare DNS_SERVER1
declare DNS_SERVER2
declare INSTALLATION_TYPE SLA
. /opt/CONFIG


check_config(){
	echo "Проверяем файл конфигурации на наличие ошибок..."
	# DOMAIN
	if [[ "$DOMAIN" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
		echo "Ошибка в файле конфигурации /opt/CONFIG!"
		echo "Вы ввели в опцию DOMAIN ip адрес, нужно ввести доменное имя"
		echo "Отредактируйте файл /opt/CONFIG и запустите повторно /opt/bin/eva_configure"
		return 1
	fi
	if ! python3 -c \
		"import validators; exit(0) if validators.domain('${DOMAIN}') else exit(1)"; then
		echo "Ошибка в файле конфигурации /opt/CONFIG!"
		echo "Введите в опцию DOMAIN корректное доменное имя. Не вводите префикс https://"
		echo "Пример: eva.example.com или my-eva-domain.ru"
		echo "Отредактируйте файл /opt/CONFIG и запустите повторно /opt/bin/eva_configure"
		return 1
	fi
	if ! python3 -c \
		"import validators; exit(0) if validators.email('${ADMIN_EMAIL}') else exit(1)"; then
		echo "Ошибка в файле конфигурации /opt/CONFIG!"
		echo "Введите в опцию ADMIN_EMAIL корректный email администратора."
		echo "Пример: admin@example.com"
		echo "Отредактируйте файл /opt/CONFIG и запустите повторно /opt/bin/eva_configure"
		return 1
	fi
	return 0
}


configure_email_server(){
	# TODO: единообразный конфиг
	/opt/fox_utils/crab_conf set SMTP_SERVER "$EMAIL_HOST_ADDR" /opt/crm/custom/config.py
	sed "s/SMTP_PORT.*/SMTP_PORT=${EMAIL_PORT}/g" -i /opt/crm/custom/config.py

	/opt/fox_utils/crab_conf set EMAIL_HOST_ADDR "$EMAIL_HOST_ADDR" /opt/crm/custom/config.py
	sed "s/EMAIL_PORT.*/EMAIL_PORT=${EMAIL_PORT}/g" -i /opt/crm/custom/config.py
	sed "s/EMAIL_PORT.*/EMAIL_PORT=${EMAIL_PORT}/g" -i /opt/crm/custom/config.py
	/opt/fox_utils/crab_conf set EMAIL_USER "$EMAIL_USER" /opt/crm/custom/config.py
	/opt/fox_utils/crab_conf set EMAIL_LOGIN "$EMAIL_LOGIN" /opt/crm/custom/config.py
	/opt/fox_utils/crab_conf set EMAIL_PASSWORD "$EMAIL_PASSWORD" /opt/crm/custom/config.py
	/opt/fox_utils/crab_conf set EMAIL_USE_SSL True /opt/crm/custom/config.py

	if [ "$EMAIL_USE_SSL" = "1" ]; then
		sed 's/EMAIL_USE_SSL.*/EMAIL_USE_SSL=True/g' -i /opt/crm/custom/config.py
	elif [ "$EMAIL_USE_SSL" = "0" ]; then
		sed 's/EMAIL_USE_SSL.*/EMAIL_USE_SSL=False/g' -i /opt/crm/custom/config.py
	else
		echo "ERROR! Опция EMAIL_USE_SSL должна быть 1 или 0"
	fi

	return 0
}


configure_resolv_conf(){
	echo "options rotate" > /etc/resolv.conf
	echo "nameserver ${DNS_SERVER1:-8.8.8.8}" >> /etc/resolv.conf
	if [ -n "${DNS_SERVER2:-}" ]; then
		echo "nameserver ${DNS_SERVER2}" >> /etc/resolv.conf
	fi
	return 0
}



configure_crm() {
	# WHATSAPP_MESSENGER_URL = 'https://whatsapp.evacrm.ru'
	# WHATSAPP_PROXY_URL = 'http://localhost:8080'
	/opt/fox_utils/crab_conf set IS_BOX_VERSION True /opt/crm/custom/config.py
	/opt/fox_utils/crab_conf set EVA_ACCOUNT_USE False /opt/crm/custom/config.py
	return 0
}


configure_wsgidav() {
	local account_auth_url org_name
	account_auth_url="$(grep -h AUTH_SERVER_URL /opt/crm/custom/config.py | awk -F'"' '{print $2}')"
	org_name="$(grep -h ORG_NAME /opt/crm/custom/config.py | awk -F'"' '{print $2}')"
	sed -E "s|(^\s{4}org_name: )(.*)|\1$org_name|; \
		s|(^\s{4}endpoint: )(.*)|\1\"$account_auth_url\"|;" \
		-i /opt/wsgidav/wsgidav.yaml
	return 0
}


configure_rdisk() {
	/opt/fox_utils/crab_conf set CONVERTER_URL "http://127.0.0.1:8083/converter/" \
		/opt/rdisk/rdisk/custom/config.py
	return 0
}


account_sync_users(){
	echo "Синхронизируем базу пользователей..."
	(
		cd /opt/crm
		python3 manage.py shell 'from cmf.include import *; models.CmfPerson.account_sync_users.apply()'
	)
	return 0
}


fix_jwt_keys() {
	# Изначально ключи приходят со сборщика, нам нужно их заменить своими кастомными.
	rm -f /opt/crm/jwt_rsa{,.pub,.pub.orig}
	if [[ ! -f /opt/crm/custom/jwt_rsa ]]; then
		(
			cd /opt/crm
			python3 manage.py generate_rsa_keypair
		)
		mv /opt/crm/jwt_rsa{,.pub} /opt/crm/custom/
	fi
	# Ключи одни и теже, потому что в коробке авторизация локальная,
	# но оставили интерфейс обмена для совместимости
	ln -s custom/jwt_rsa /opt/crm/
	ln -s custom/jwt_rsa.pub /opt/crm/
	return 0
}


do_autogen() {
	(
		cd /opt/crm
		python3 manage.py autogen
	)
	return 0
}


sync_custom_skelet() {
	if [ -d /opt/custom/skelet ]; then
		/opt/fox_utils/crab_skelet_init /opt/custom/skelet/ /
	fi
	return 0
}

gen_crypt_keys(){
	local key iv
	if ! grep -q "SESSION_CRYPT_KEY" /opt/crm/custom/config.py; then
		key="$(openssl rand -hex 32)"
		iv="$(openssl rand -hex 16)"
		/opt/fox_utils/crab_conf set SESSION_CRYPT_KEY "AES:${iv}:${key}" /opt/crm/custom/config.py
	fi
	return 0
}


main() {
	if ! [[ ${INSTALLATION_TYPE:-} ]]; then
		INSTALLATION_TYPE=box
		/opt/fox_utils/crab_conf set INSTALLATION_TYPE box /opt/CONFIG
	fi
	sync_custom_skelet
	gen_crypt_keys
	if [[ $INSTALLATION_TYPE = cloud ]]; then
		# TODO: ??? Надо ли какую-то доп настройку под облако?
		# install -d /opt/crm/custom
		# touch /opt/crm/custom/config.py
		# # ??
		# echo evateam.ru > /opt/crm/custom/cloud_name
		if [[ $SLA ]]; then
			# TODO: выпилить fox_acrm
			# TODO: /opt/fox_acrm/deploy/provision.py - не заточен под коробку.
			/opt/fox_acrm/deploy/provision.py --sla "$SLA" --redis --postgres --uwsgi
		fi
		echo "Nothing to configure for cloud" >&2
	elif [[ $INSTALLATION_TYPE = box ]]; then
		check_config
		/opt/bin/_nginx_configure
		configure_email_server
		configure_resolv_conf
		configure_crm
		configure_wsgidav
		configure_rdisk
		fix_jwt_keys
	else
		echo "Unsupported INSTALLATION_TYPE=$INSTALLATION_TYPE in /opt/CONFIG" >&2
		return 1
	fi
	do_autogen
	if [ "${ARG_DONT_RESTART_SERVICES:-}" = "" ]; then
		/opt/bin/services restart
	fi
	if [ "${ARG_ACCOUNT_SYNC_USERS:-}" = "TRUE" ]; then
		account_sync_users
	fi
	return 0
}


main
exit 0
