#!/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

init_color

ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

 PostgresQL DB factory reset default script.

 The script can destroy all data in the database and rollback the PostgresQL settings 
   to their original state.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}-m${N0_COLOR} - mode: 'start' to execute factory reset default.
 ${N2_COLOR}-t${N0_COLOR} - target of components: 'data', 'settings', 'all':
                            'data'    - DROPDB only;
                            'settings - DROP PostgresQL settings only (for local PgSQL only!);
                            'all' (default) - 'data settings'

${H3_COLOR}Examples${N0_COLOR}:

 # reset_postgresql -m start
 # reset_portgresql -m start -t 'data'

"

usage()
{
	${ECHO} "${ADDHELP}"
	exit 0
}

# instead of DROPDB (support for external DB where we have no authority CREATEDB ) we use
# drop TABLE here
reset_data()
{
	local _ret=

  # spacevm specific. remove file-markers on all nodes
  ${ECHO} "${N1_COLOR}reset: remove ${N2_COLOR}file markers${N0_COLOR}"
  /usr/local/sbin/veil-node bash_cmd_nodes 'rm /var/lib/ecp-veil/controller_member'
  /usr/local/sbin/veil-node bash_cmd_nodes 'rm /var/lib/ecp-veil/node/local_data/heartbeat.json'
  /usr/local/sbin/veil-node bash_cmd_nodes 'rm -rf /var/lib/ecp-veil/controller/domains/*'
  /usr/local/sbin/veil-node bash_cmd_nodes 'rm /var/lib/ecp-veil/local_data/*'

	${ECHO} "${N1_COLOR}reset: ${N2_COLOR}data ...${N0_COLOR}"
	${ECHO} "${N1_COLOR}reset_postgres: reset_data: psql -t postgresql://${PGSQL_DB_USER}:XXXXXXXX@${PGSQL_DB_HOST}:${PGSQL_DB_PORT}/${PGSQL_DB_NAME}?sslmode=disable -Ac \"SELECT 1 FROM pg_database LIMIT 1;\""

	_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 )
	_ret=$?

	if [ ${_ret} -ne 0 ]; then
		err 1 "${W1_COLOR}reset_postgres: reset_data error: ${N1_COLOR}psql not available: ${N2_COLOR}${_database_ok}${N0_COLOR}"
	fi

	if [ "${_database_ok}" != "1" ]; then
		${ECHO} "${W1_COLOR}reset_postgres: reset data warning: ${N1_COLOR}database not exist: ${N2_COLOR}${PGSQL_DB_NAME}${N0_COLOR}"
		return 0
	fi

	${ECHO} "${N1_COLOR}reset_postgres: reset data: database found, 'drop owned by the_user': ${N2_COLOR}${PGSQL_DB_USER}${N0_COLOR}"

	# select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;

	# If everything you want to drop is owned by the same user, then you can use:
	psql -t postgresql://${PGSQL_DB_USER}:${PGSQL_DB_PASSWORD}@${PGSQL_DB_HOST}:${PGSQL_DB_PORT}/${PGSQL_DB_NAME}?sslmode=disable -Ac "DROP OWNED BY ${PGSQL_DB_USER};" 2>&1
	_ret=$?

	# re-run migrate script
	/var/lib/ecp-veil/controller/other/init_controller_db
}

reset_settings()
{
	${ECHO} "${N1_COLOR}reset: ${N2_COLOR}settings ...${N0_COLOR}"

	for i in local_modules modules users nodes local_user; do
		[ -r /var/lib/ecp-veil/data/${i}/pgsql.yaml ] && ${RM_CMD} -f /var/lib/ecp-veil/data/${i}/pgsql.yaml
	done

	return 0
}


## MAIN
mode=
target="data settings"

# -t just test for update available
while getopts "m:t:" opt; do
	case "${opt}" in
		m)
			mode="${OPTARG}"
			;;
		t)
			target="${OPTARG}"
			;;
		*)
			usage
			;;
	esac
done
shift $(($OPTIND - 1))

case "${mode}" in
	start)
		true
		;;
	*)
		usage
		;;
esac

[ -r /etc/veil/controller.conf ] && . /etc/veil/controller.conf

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

# no config/data ? try localhost
[ -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}"

for i in ${target}; do
	case "${i}" in
		data|settings)
			reset_${i}
			;;
		*)
			${ECHO} "${W1_COLOR}reset target unknown: ${N2_COLOR}${i}${N0_COLOR}"
			;;
	esac
done

# apply role at the end
# check by 127.0.0.1, no postgres-server package?
[ ${PGSQL_SERVER_INSTALLED} -eq 0 ] && return 0

/usr/local/sbin/veil-role -a pgsql
ret=$?


restart_services postgresql controller-supervisor daphne-django node_supervisor

#restart_services postgresql postgresql@17-main
#restart_services controller-supervisor gunicorn-django daphne-django node_supervisor

exit ${ret}
