#!/bin/bash

# Source YunoHost helpers
source /usr/share/yunohost/helpers

# Stop script if errors
ynh_abort_if_errors

# Import common cmd
source ./psql.sh
source ./experimental_helper.sh
source ./_common.sh

# Retrieve arguments
domain=$(ynh_app_setting_get $app special_domain)
path_url=$(ynh_app_setting_get $app special_path)
final_path=$(ynh_app_setting_get $app final_path)
synapse_old_version=$(ynh_app_setting_get $app synapse_version)
synapse_db_pwd=$(ynh_app_setting_get $app synapse_db_pwd)
is_public=$(ynh_app_setting_get $app is_public)
port=$(ynh_app_setting_get $app synapse_port)
synapse_tls_port=$(ynh_app_setting_get $app synapse_tls_port)
turnserver_tls_port=$(ynh_app_setting_get $app turnserver_tls_port)
turnserver_alt_tls_port=$(ynh_app_setting_get $app turnserver_alt_tls_port)
turnserver_pwd=$(ynh_app_setting_get $app turnserver_pwd)
cli_port=$(ynh_app_setting_get $app cli_port)

# To be sure that the migration is sucessfull we check that the old synapse version is compatible with the synapse_port_db script.
if [[ -z $synapse_old_version ]] && [[ $(dpkg -l | grep -c -E "ii.*matrix-synapse.*0.25") != 1 ]] && [[ $(dpkg -l | grep -c -E "ii.*matrix-synapse.*0.26") != 1 ]]
then
	ynh_die "Update from this synapse version is not available now. You need to wait for the next update."
fi

systemctl stop matrix-$app.service

if [[ $(ynh_app_setting_get $app disable_backup_before_upgrade) != '1' ]]
then
    ynh_backup_before_upgrade
    ynh_clean_setup () {
        ynh_restore_upgradebackup
    }
fi

ynh_abort_if_errors

if [[ -z $synapse_old_version ]]
then

	##  We move from debian package to new package with python virtualenv
	# Change settings
	path_url="/_matrix"
	domain=$(ynh_app_setting_get $app domain)
	final_path="/opt/yunohost/matrix-synapse"
	ynh_app_setting_set $app special_domain $domain
	ynh_app_setting_set $app special_path $path_url
	ynh_app_setting_set $app final_path $final_path
	ynh_app_setting_delete $app domain
	ynh_app_setting_delete $app path
	ynh_app_setting_delete $app skipped_uris

	# Remove old package and add new package as dependance
	ynh_secure_remove /etc/apt/sources.list.d/matrix.list
	ynh_package_autoremove --purge matrix-synapse python-matrix-synapse-ldap3 || true

	# If we don't remove these line in dpkg config, dpkg fail on every new package install
	sudo sed --in-place ':a;N;$!ba;s@matrix-synapse nogroup 755 /var/lib/matrix-synapse\n@@g' /var/lib/dpkg/statoverride
	sudo sed --in-place ':a;N;$!ba;s@matrix-synapse nogroup 755 /var/log/matrix-synapse\n@@g' /var/lib/dpkg/statoverride
	sudo sed --in-place ':a;N;$!ba;s@matrix-synapse nogroup 755 /etc/matrix-synapse\n@@g' /var/lib/dpkg/statoverride

	# add new package as dependance and install dependance
	install_dependances

	# Create directory Install synapse in virtualenv
	setup_dir || true # If the dir aready exist the command could fail
	install_source
    cp /etc/yunohost/certs/$domain/dh.pem /etc/matrix-synapse/dh.pem
	set_permission

	# Open access to server without a button the home
	cp ../conf/add_sso_conf.py $final_path
	cp ../conf/remove_sso_conf.py $final_path
	python $final_path/add_sso_conf.py || echo "Error while sso config, please add '/_matrix' in /etc/ssowat/conf.json.persistent"

	# Create user
	ynh_system_user_create $synapse_user /var/lib/matrix-synapse
    adduser $synapse_user ssl-cert
    adduser turnserver ssl-cert

	# Create systemd service
	ynh_secure_remove /etc/init.d/matrix-synapse
	ynh_secure_remove /lib/systemd/system/matrix-synapse.service
	ynh_secure_remove /etc/systemd/system/matrix-synapse.service
	systemctl daemon-reload
	systemctl disable matrix-synapse.service

	cp ../conf/default_matrix-synapse /etc/default/matrix-synapse
	cp ../conf/matrix-synapse.service /etc/systemd/system/matrix-synapse.service
	ynh_replace_string __APP__ $app /etc/systemd/system/matrix-synapse.service
	systemctl daemon-reload
	systemctl enable matrix-synapse.service

	# Configuration de logrotate
	ynh_use_logrotate /var/log/matrix-synapse

	# register yunohost service
	yunohost service add matrix-synapse

	## Move to postgresql from sqlite

	# We create the new settings
	synapse_db_pwd=$(ynh_string_random 30)
	ynh_app_setting_set $app synapse_db_pwd $synapse_db_pwd

	# Create postgresql database
	ynh_psql_create_user $synapse_db_user $synapse_db_pwd
	ynh_psql_execute_as_root \
	"CREATE DATABASE $synapse_db_name ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER $synapse_db_user;"

	# Create config file for synapse with postgresql
	config_synapse
	
	# We get the last version of the synapse_port_db script because an old version could be buggy.
	cp ../sources/synapse_port_db /opt/yunohost/matrix-synapse/bin/synapse_port_db
	
	# Migrate database (in virtualenv)
	source $final_path/bin/activate
	/opt/yunohost/matrix-synapse/bin/synapse_port_db --sqlite-database /var/lib/matrix-synapse/homeserver.db \
	--postgres-config /etc/matrix-synapse/homeserver.yaml
	deactivate
fi

# Disable default config for turnserver and create a new service
if [[ ! -e /etc/matrix-$app/coturn.conf ]]
then
    systemctl stop coturn.service
    
    # Set by default the system config for coturn
    echo "" > /etc/turnserver.conf
    ynh_replace_string "TURNSERVER_ENABLED=1" "TURNSERVER_ENABLED=0" /etc/default/coturn
    
    # Set a port for each service in turnserver
    turnserver_alt_tls_port=$(ynh_find_port $((turnserver_tls_port+1)))
    cli_port=$(ynh_find_port 5766)
    
    ynh_app_setting_set $app turnserver_alt_tls_port $turnserver_alt_tls_port
    ynh_app_setting_set $app cli_port $cli_port
    
    yunohost firewall allow --no-upnp Both $turnserver_alt_tls_port > /dev/null 2>&1
    
    # Configure systemd
    cp ../conf/default_coturn /etc/default/coturn-$app
    cp ../conf/coturn-synapse.service /etc/systemd/system/coturn-$app.service
    ynh_replace_string __APP__ $app /etc/systemd/system/coturn-$app.service

    systemctl daemon-reload
    systemctl enable coturn-$app.service
    
    # Clean logrotate file for all old instances
    ynh_remove_logrotate
    ynh_use_logrotate /var/log/matrix-$app
fi

# Fix issue about certificates access
if [[ ! $(grep "ssl-cert:x:[0-9]*:.*matrix-$app" /etc/group) ]]
then
    adduser $synapse_user ssl-cert
    adduser turnserver ssl-cert
fi

# If we don't have the dh file in synapse config dir we copy it
test -e /etc/matrix-$app/dh.pem || cp /etc/yunohost/certs/$domain/dh.pem /etc/matrix-$app/dh.pem

# Upgrade manually Synapse
install_source

# Update nginx config
ynh_add_nginx_config

# Configure Synapse
config_synapse

# Configure Coturn
config_coturn

# Set Permission for all directory
set_permission

# Set new settings
ynh_app_setting_set $app synapse_version $upstream_version

# Restart service
systemctl restart coturn-$app.service
ynh_check_starting "Synapse now listening on port 8448" "/var/log/matrix-$app/homeserver.log" 300 "matrix-$app"