#!/bin/sh

set_listen_addresses() {
	sedEscapedValue="$(echo "$1" | sed 's/[\/&]/\\&/g')"
	sed -ri "s/^#?(listen_addresses\s*=\s*)\S+/\1'$sedEscapedValue'/" "$PGDATA/postgresql.conf"
}

if [ "$1" = 'postgres' ]; then
    mkdir -p "$PGDATA"
    chmod 0700 "$PGDATA"
    chown -R postgres "$PGDATA"

    mkdir -p /run/postgresql
    chmod g+s /run/postgresql
    chown -R postgres /run/postgresql

    if [ -z "$(ls -A "$PGDATA")" ]; then
        gosu postgres initdb

        if [ "$POSTGRES_PASSWORD" ]; then
            pass="PASSWORD '$POSTGRES_PASSWORD'"
            authMethod=md5
        else
            cat >&2 <<-EOWARN
                ****************************************************
                WARNING: No password has been set for the database.
                         This will allow anyone with access to the
                         Postgres port to access your database. In
                         Docker's default configuration, this is
                         effectively any other container on the same
                         system.
                         Use "-e POSTGRES_PASSWORD=password" to set
                         it in "docker run".
                ****************************************************
EOWARN
            pass=
            authMethod=trust
        fi

        { echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA/pg_hba.conf"

        gosu postgres pg_ctl -D "$PGDATA" \
            -o "-c listen_addresses=''" \
            -w start
        : ${POSTGRES_USER:=postgres}
        : ${POSTGRES_DB:=$POSTGRES_USER}
        export POSTGRES_USER POSTGRES_DB

        if [ "$POSTGRES_DB" != 'postgres' ]; then
            psql --username postgres <<-EOSQL
                CREATE DATABASE "$POSTGRES_DB" ;
EOSQL
            echo
        fi

        if [ "$POSTGRES_USER" == 'postgres' ]; then
            op='ALTER'
        else
            op='CREATE'
        fi

        psql --username postgres <<-EOSQL
            $op USER "$POSTGRES_USER" WITH SUPERUSER $pass ;
EOSQL
        echo

        echo
        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)  echo "$0: running $f"; . "$f" ;;
                *.sql) echo "$0: running $f"; psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f" && echo ;;
                *)     echo "$0: ignoring $f" ;;
            esac
        done

        gosu postgres pg_ctl -D "$PGDATA" -m fast -w stop
        set_listen_addresses '*'

        echo
        echo 'PostgreSQL init process complete; ready for start up.'
        echo
    fi

    exec gosu postgres "$@"
fi

exec "$@"
