#!/bin/sh

set -e

if [ "X${PLESK_INSTALLER_DEBUG}" != "X" ]; then
    set -x
fi

ADMIN="admin"
ADMIN_PASSWORD=`cat /etc/psa/.psa.shadow`
NAME="plesk-billing"	# product name
DB_NAME="billing"
DB_HOST="localhost"
DB_USER="billing"

PORT="8443"

PLESK_DIR="/usr/local/psa"


random_str()
{
	local len="$1"	# random string length
	if [ "X$len" = "X" ]; then
		len=40	# like sha1
	fi
	dd if=/dev/urandom count=20 2>/dev/null | openssl sha1 | cut -c 1-$len
}

escape_str()
{
	# converts ' --> \'  and  \ --> \\
	echo "$1" | sed -e 's|\(['\''\]\)|\\\1|g'
}

sha1()
{
	echo -n "$1" | openssl sha1
}

export DB_PASSWORD=`random_str`

db_query()
{
	local query="$1";
	mysql -u "$ADMIN" "-p$ADMIN_PASSWORD" -h "$DB_HOST" -A --skip-column-names --batch --raw -e "$query" "$DB_NAME"	# MySQL 3.23 doesn't recognize --skip-auto-rehash option, used -A instead
}

echo2()
{
	echo "$1" >&2
}

die()
{
	echo2 "$1"
	exit 1;
}

drop_dbuser()
{
	db_query "REVOKE ALL ON \`$DB_NAME\`.* FROM '$DB_USER'@'localhost'"	# for mysql server < 5.0.2
	db_query "DROP USER '$DB_USER'@'localhost'"
	res=$?
	db_query "FLUSH PRIVILEGES"
	return $res
}

drop_database()
{
	mysqladmin -u "$ADMIN" "-p$ADMIN_PASSWORD" -h "$DB_HOST" drop --force "$DB_NAME"
}

create_database()
{
	local database_name="$DB_NAME";
	local i=10;

	while [ $i -gt 0 ]; do

		mysqladmin -u "$ADMIN" "-p$ADMIN_PASSWORD" -h "$DB_HOST" create "$database_name" 2>/dev/null && break

		database_name="${DB_NAME}_`random_str 4`"
		i=`expr $i - 1`

	done;

	if [ $i -eq 0 ]; then
		DB_NAME=""
		return 1;
	fi

	DB_NAME="$database_name"

	return 0;
}

create_dbuser()
{
	local user="$DB_USER"
	local i=10;

	while [ $i -gt 0 ]; do

		#db_query "CREATE USER '$user'@'localhost' IDENTIFIED BY '$DB_PASSWORD'"	# works only for mysql server >= 5.0.2
		db_query "INSERT INTO mysql.user (User, Host, Password) VALUES ('$user', 'localhost', PASSWORD('$DB_PASSWORD'))" 2>/dev/null && break

		user="${DB_USER}_`random_str 4`"
		i=`expr $i - 1`

	done;

	if [ $i -eq 0 ]; then
		DB_USER=""
		return 1;
	fi

	db_query "FLUSH PRIVILEGES" || return 1

	DB_USER="$user"

	res=0
	db_query "GRANT ALL ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost'" || res=1
	if [ $res -eq 1 ]; then
		# rollback
		drop_dbuser
		return 1;
	fi

	db_query "FLUSH PRIVILEGES" || return 1

	return 0;
}

create_config()
{
	local config_file="$INSTALL_PREFIX/$NAME/lib-modernbill/include/config/config.php"

	touch "$config_file" || return 1

	chmod 400 "$config_file" || return 1

	local standard_url="$SERVER_NAME:$PORT/$NAME"

	local cah=`random_str` || return 1

	sed -e "s|@@DB_NAME@@|$DB_NAME|g" \
		-e "s|@@DB_USER@@|$DB_USER|g" \
		-e "s|@@DB_PASSWORD@@|$DB_PASSWORD|g" \
		-e "s|@@STANDARD_URL@@|$standard_url|g" \
		-e "s|@@REMOTE_ACCESS_HASH@@|$cah|g" \
		< "$config_file.tmpl" > "$config_file" || return 1

	chown psaadm "$config_file" || return 1

	return 0
}

create_db_struct()
{
	db_dump="$INSTALL_PREFIX/$NAME/lib-db/database_dump.sql"
	if [ ! -f "$db_dump" ]; then
		echo2 "Unable to find database dump file: '$db_dump'"
		return 1
	fi

	mysql -u "$ADMIN" "-p$ADMIN_PASSWORD" -h "$DB_HOST" "$DB_NAME" < "$db_dump" || return 1

	rm "$db_dump" || return 1


	# set up unique remote_access_admin_hash
	db_query "UPDATE admins SET admin_remote_access_hash='`random_str`' WHERE admin_username='admin'" || return 1
	db_query "UPDATE admins SET admin_remote_access_hash='`random_str`' WHERE admin_username='admin_ezorder'" || return 1
	db_query "UPDATE admins SET admin_remote_access_hash='`random_str`' WHERE admin_username='admin_api'" || return 1
	db_query "UPDATE admins SET admin_remote_access_hash='`random_str`' WHERE admin_username='cronadmin'" || return 1

	local base_url="https://$SERVER_NAME:$PORT"
	# set up companies
	company_client_url="$base_url/$NAME/app-modernbill-client/"
	company_order_url="$base_url/$NAME/app-modernbill-order/"
	db_query "UPDATE companies SET company_client_url='$company_client_url', company_order_url='$company_order_url'" || return 1

	# set up Plesk connection parameters
	# escape password properly
	password=`escape_str "$ADMIN_PASSWORD"`
	db_query "UPDATE config_params SET config_param_value='$password' WHERE config_param_name='modulePassword' AND config_param_description='TRANS_PLESK_PASSWORD_DESC'" || return 1

	shared_ip=`get_shared_ip` || return 1
	if [ -n "$shared_ip" ]; then
		db_query "UPDATE config_params SET config_param_value='$shared_ip' WHERE config_param_name='ip' AND config_param_description='TRANS_PANEL_PLESK_SHARED_IP_DESC'" || return 1
	fi

	# update api parameter
	db_query "UPDATE config_params SET config_param_value='$base_url' WHERE config_param_name='api' AND config_param_trans_key='TRANS_PLESK_URL'" || return 1

	# update Display_Logo parameter
	db_query "UPDATE config_params SET config_param_value='$base_url/$NAME/lib-themes/default/lib-modernbill/images/logos/logo.gif' WHERE config_param_name='Display_Logo'" || return 1

	# update IPN_URL parameter
	db_query "UPDATE config_params SET config_param_value='$base_url/$NAME/lib-mbapi/include/modules/gateway/return/paypal.php' WHERE config_param_name='IPN_URL'" || return 1

	# set up order form params
	db_query "UPDATE order_form_params SET order_form_param_value='$base_url/$NAME/app-modernbill-order/' WHERE order_form_param_name='continue_shopping_url'" || return 1
	db_query "UPDATE order_form_params SET order_form_param_value='$base_url/' WHERE order_form_param_name='terms_url'" || return 1

	return 0
}

get_shared_ip()
{
	"$PLESK_DIR/bin/ipmanage" --ip_list | awk '/^[0-9][[:space:]]+S/ {split($3, a, "[:/]"); print a[2]; nextfile}'
}

set_admin_info()
{
	# set up ModernBill admin password the same as in Plesk
	# encrypt admin password
	local password=`sha1 "$ADMIN_PASSWORD"`
	password=`sha1 "$password"`
	db_query "UPDATE admins SET admin_password='$password'" || return 1

	# fetch admin's personal info

	# personal name
	pname=`db_query 'SELECT val FROM psa.misc WHERE param="admin_pname"'`
	email=`db_query 'SELECT val FROM psa.misc WHERE param="admin_email"'`
	company=`db_query 'SELECT val FROM psa.misc WHERE param="admin_cname"'`
	phone=`db_query 'SELECT val FROM psa.misc WHERE param="admin_phone"'`
	fax=`db_query 'SELECT val FROM psa.misc WHERE param="admin_fax"'`

	address=`db_query 'SELECT val FROM psa.misc WHERE param="admin_address"'`
	city=`db_query 'SELECT val FROM psa.misc WHERE param="admin_city"'`
	zip=`db_query 'SELECT val FROM psa.misc WHERE param="admin_pcode"'`
	state=`db_query 'SELECT val FROM psa.misc WHERE param="admin_state"'`
	country=`db_query 'SELECT val FROM psa.misc WHERE param="admin_country"'`

	# update plesk-billing

	pname=`escape_str "$pname"`
	email=`escape_str "$email"`
	company=`escape_str "$company"`
	phone=`escape_str "$phone"`
	fax=`escape_str "$fax"`

	address=`escape_str "$address"`
	city=`escape_str "$city"`
	zip=`escape_str "$zip"`
	state=`escape_str "$state"`
	country=`escape_str "$country"`

	# convert country into the country_id
	country_id=`db_query "SELECT countries_id FROM countries WHERE countries_iso_2 = '$country'"`

	db_query "UPDATE admins SET admin_last_name='$pname', admin_email='$email', countries_id='$country_id' WHERE admin_id=1"

	db_query "UPDATE companies SET company_name='$company', company_email='$email', company_address_1='$address', company_city='$city', company_state='$state', company_zip='$zip', countries_id='$country_id', company_phone1='$phone', company_fax='$fax', countries_id='$country_id' WHERE company_id=1"
}
#INSTALL_PREFIX="$PKG_PREFIX"
INSTALL_PREFIX="/usr/local"

if [ "POST-INSTALL" != "$2" ]; then
	exit 0;
fi


if [ -z "$UPGRADE_PORT" ]; then
	mode="install"
else
	mode="upgrade"
fi

case "$mode" in

	install)

		#create database
		create_database || die "Unable to create database"
		echo "Database created: $DB_NAME"

		#create database user
		create_dbuser || die "Unable to create database user"
		echo "Database user created: $DB_USER"

		SERVER_NAME=`db_query "SELECT val FROM psa.misc WHERE param='FullHostName'"` || echo2 "Unable to define FullHostName"
		#if [ -n "$SERVER_NAME" ]; then
			# TODO try to define full hostname in other ways
		#fi

		psa_configured=`db_query "SELECT val FROM psa.misc WHERE param='psa_configured'"` || die "Unable to define if Plesk is configured or not"

		#create config file
		create_config || die "Unable to create configuration file"
		echo "Configuration file created"

		create_db_struct || die "Unable to create database structure"

		if [ "X$psa_configured" = "Xtrue" ]; then	# Plesk is configured, copy admin info from Plesk
			set_admin_info || die "Unable to set up admin's personal info"
		fi
		;;

	upgrade)
		# nothing to do in upgrader at this moment
		;;

esac
