#!/bin/sh
color_subr="/usr/share/veil/color.subr"
system_subr="/usr/share/veil/system.subr"
deb_subr="/usr/share/veil/deb.subr"
controller_subr="/usr/share/veil/controller.subr"

set -e
. ${color_subr}
. ${system_subr}
. ${deb_subr}
. ${controller_subr}
set +e

## MAIN
init_color
DEB_LOGFILE="/var/log/veil/controller/init_controller_db.log"

PGSQL_SERVER_INSTALLED=0
PGBOUNCER_INSTALLED=0

# check if postgresql-server package exist
PKG_CONFIG_CMD=$( which pg_config 2>/dev/null )
[ -z "${PKG_CONFIG_CMD}" ] && err 1 "${W1_COLOR}init_controller_db failed: ${N1_COLOR}no such pg_config executable, postgresql-client ?${N0_COLOR}"

PG_BINDIR=$( ${PKG_CONFIG_CMD} --bindir 2>/dev/null )
[ -z "${PG_BINDIR}" ] && err 1 "${W1_COLOR}init_controller_db failed: ${N1_COLOR}no such PG_BINDIR: ${N2_COLOR}${PKG_CONFIG_CMD} --bindir${N0_COLOR}"

if [ -x "${PG_BINDIR}/postgres" ]; then
	PGSQL_SERVER_INSTALLED=1
else
	PGSQL_SERVER_INSTALLED=0
fi

PGBOUNCER_CMD=$( which pgbouncer 2>/dev/null )
if [ -n "${PGBOUNCER_CMD}" ]; then
	PGBOUNCER_INSTALLED=1
else
	PGBOUNCER_INSTALLED=0
fi

# legacy config
[ -r /etc/veil/controller.conf ] && . /etc/veil/controller.conf
# new config
[ -r /etc/veil/controller/controller.conf ] && . /etc/veil/controller/controller.conf

#
[ -z "${PGSQL_DB_HOST}" ] && PGSQL_DB_HOST="127.0.0.1"
[ -z "${PGSQL_DB_PORT}" ] && PGSQL_DB_PORT="5432"

echo "PGSQL_SERVER_INSTALLED=${PGSQL_SERVER_INSTALLED}"
echo "PGBOUNCER_INSTALLED=${PGBOUNCER_INSTALLED}"
echo "PGSQL_DB_HOST=${PGSQL_DB_HOST}"
echo "PGSQL_DB_PORT=${PGSQL_DB_PORT}"

if [ ${PGSQL_SERVER_INSTALLED} -eq 1 ]; then
	st_time=$( ${DATE_CMD} +%s )
	${ECHO} "${N1_COLOR}apply roles: ${N2_COLOR}pgsql${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
	/usr/local/sbin/veil-role -a pgsql | ${TEE_CMD} -a ${DEB_LOGFILE}
	end_time=$( ${DATE_CMD} +%s )
	diff_time=$(( end_time - st_time ))
	diff_time=$( displaytime ${diff_time} )
	${ECHO} "${N1_COLOR}apply roles  done ${N2_COLOR}in ${diff_time}${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}

	# wait for a little before SQL query
	sleep 3

	retval=$( ${SUDO_CMD} -u postgres psql -tc "SELECT 1 FROM pg_catalog.pg_database WHERE datname='${PGSQL_DB_NAME}';" 2>/dev/null )
	if [ -z "${retval}" ]; then
		err 1 "${W1_COLOR}Error: database not found: ${N2_COLOR}${PGSQL_DB_NAME}${N0_COLOR}"
	fi
	${ECHO} "${N1_COLOR} Local PgSQL database available: ${N2_COLOR}${PGSQL_DB_NAME}${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
fi

if [ ${PGBOUNCER_INSTALLED} -eq 1 ]; then
	st_time=$( ${DATE_CMD} +%s )
	${ECHO} "${N1_COLOR}apply roles: ${N2_COLOR}pgbouncer${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
	/usr/local/sbin/veil-role -a pgbouncer | ${TEE_CMD} -a ${DEB_LOGFILE}
	end_time=$( ${DATE_CMD} +%s )
	diff_time=$(( end_time - st_time ))
	diff_time=$( displaytime ${diff_time} )
	${ECHO} "${N1_COLOR}apply roles done ${N2_COLOR}in ${diff_time}${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
fi

echo "PgSQL credential: postgresql://${PGSQL_DB_USER}:XXXXXXXXXX@${PGSQL_DB_HOST}:${PGSQL_DB_PORT}/${PGSQL_DB_NAME}"

max_wait=10
for i in $( ${SEQ_CMD} 1 ${max_wait} ); do
	if [ ${i} -eq ${max_wait} ]; then
		err 1 "${W1_COLOR}Database not ready: ${N2_COLOR}postgresql://${PGSQL_DB_USER}:XXXXXXXXXX@${PGSQL_DB_HOST}:${PGSQL_DB_PORT}/${PGSQL_DB_NAME}${N0_COLOR}"
	fi
	${ECHO} "${N1_COLOR}Waiting for pgbouncer: ${N2_COLOR}${i}/${max_wait}${N0_COLOR}"
	_database_ok=$( psql -t postgresql://${PGSQL_DB_USER}:${PGSQL_DB_PASSWORD}@${PGSQL_DB_HOST}:${PGSQL_DB_PORT}/${PGSQL_DB_NAME}?sslmode=disable -Ac "SELECT 1 FROM pg_database LIMIT 1;" 2>&1 )
	if [ "${_database_ok}" != "1" ]; then
		echo "  not ready: ${_database_ok}"
		sleep 1
		continue
	else
		echo "  done: ${_database_ok}"
		break
	fi
done

st_time=$( ${DATE_CMD} +%s )
${ECHO} "${N1_COLOR}apply roles: ${N2_COLOR}space_controller_settings${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
/usr/local/sbin/veil-role -a space_controller_settings | ${TEE_CMD} -a ${DEB_LOGFILE}
end_time=$( ${DATE_CMD} +%s )
diff_time=$(( end_time - st_time ))
diff_time=$( displaytime ${diff_time} )
${ECHO} "${N1_COLOR}apply roles done ${N2_COLOR}in ${diff_time}${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}

${ECHO} "${N1_COLOR}Run DB migrate...${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
migrate_db | ${TEE_CMD} -a ${DEB_LOGFILE}
_ret=$?

if [ ${_ret} -ne 0 ]; then
	err 1 "${W1_COLOR}init_controller_db: migrate_db failed${N0_COLOR}"
fi

${ECHO} "${N1_COLOR}Create Django admin user...${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
create_db_adminuser | ${TEE_CMD} -a ${DEB_LOGFILE}

${ECHO} "${N1_COLOR}Compilemessages...${N0_COLOR}" | ${TEE_CMD} -a ${DEB_LOGFILE}
compile_messages | ${TEE_CMD} -a ${DEB_LOGFILE}

exit 0
